Запуск docker-compose внутри Google Cloud Engine
Я пытаюсь запустить небольшое приложение для создания докеров внутри оптимизированного для контейнера узла Google Cloud Compute Engine, но я застреваю, когда он пытается смонтировать тома во время docker-compose up
:
Creating lightning_redis_1 ...
Creating lightning_db_1 ...
Creating lightning_redis_1
Creating lightning_db_1 ... done
Creating lightning_api_1 ...
Creating lightning_api_1 ... error
ERROR: for lightning_api_1 Cannot start service api: error while creating mount source path '/rootfs/home/jeremy/lightning': mkdir /rootfs: read-only file sys
tem
ERROR: for api Cannot start service api: error while creating mount source path '/rootfs/home/jeremy/lightning': mkdir /rootfs: read-only file system
Encountered errors while bringing up the project.
jeremy@instance-1 ~/lightning $
Мой файл docker-compose.yml выглядит так:
version: '3'
services:
client:
build: ./client
volumes:
- ./client:/usr/src/app
ports:
- "4200:4200"
- "9876:9876"
links:
- api
command: bash -c "yarn --pure-lockfile && yarn start"
sidekiq:
build: .
command: bundle exec sidekiq
volumes:
- .:/api
depends_on:
- db
- redis
- api
redis:
image: redis
ports:
- "6379:6379"
db:
image: postgres
ports:
- "5433:5432"
api:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
Я не хочу ничего менять в файле docker-compose.yml - я предпочел бы иметь возможность исправить эту проблему, запустив команды внутри самой ВМ или как я настроил ВМ. Причина в том, что это не мой код, и я не могу легко изменить файл docker-compose.yml, и все, что мне нужно сделать, это запустить его в течение короткого периода времени и выполнить несколько команд docker-compose внутри виртуальной машины.
2 ответа
Оптимизированная для контейнеров ОС обычно монтирует большинство путей только для чтения. Вот почему вы получаете ошибку
source path '/rootfs/home/jeremy/lightning': mkdir /rootfs: read-only file sys
Таким образом, у вас есть несколько вариантов
Использовать именованные тома в docker-compose
Вам нужно будет изменить свои объемы, как показано ниже
volumes:
- myappvol:/myapp
и определить объемы верхнего уровня в составе
volumes:
myappvol: {}
Как вы сказали, вы не хотите изменять yaml, тогда это может не сработать
Запустите docker-compose внутри докера
В настоящее время вы работаете docker-compose
на основной машине, вместо этого вы должны использовать docker-compose
внутри другого контейнера докера, который имеет основную корневую папку
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD:/rootfs/$PWD" \
-w="/rootfs/$PWD" \
docker/compose:1.13.0 up
Это будет работать, но данные будут сохраняться в самом контейнере Docker.
Смотрите ниже статью для более подробной информации
https://cloud.google.com/community/tutorials/docker-compose-on-container-optimized-os
У меня была та же ошибка, я решил ее, удалив каталог 'rootfs' при монтировании контейнера докера (вы не можете писать в этот каталог).
Просто измените:
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD:/rootfs/$PWD" \
-w="/rootfs/$PWD" \
docker/compose:1.13.0 up
От:
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD:$PWD" \
-w="$PWD" \
docker/compose:1.13.0 up