J'essaie d'exécuter une petite application de composition de docker dans un nœud Google Cloud Compute Engine optimisé pour le conteneur, mais je suis bloqué lorsqu'il tente de monter des volumes au cours d'un 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 $
Mon fichier docker-compose.yml ressemble à ceci:
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
Je ne souhaite rien modifier dans le fichier docker-compose.yml. Je préférerais pouvoir résoudre ce problème en exécutant des commandes dans le VM lui-même, ou dans la façon dont je règle le VM up. La raison en est que ce n'est pas mon code et que je ne peux pas changer facilement le fichier docker-compose.yml. Tout ce que j'ai à faire, c'est de l'exécuter pendant une courte période et d'exécuter quelques commandes docker-compose dans la machine virtuelle.
Le système d'exploitation optimisé pour les conteneurs monte généralement la plupart des chemins en lecture seule. C'est pourquoi vous obtenez l'erreur
source path '/rootfs/home/jeremy/lightning': mkdir /rootfs: read-only file sys
Donc vous avez peu d'options
Utiliser des volumes nommés dans docker-compose
Vous devrez changer vos volumes comme ci-dessous
volumes:
- myappvol:/myapp
et définir les volumes de premier niveau en composition
volumes:
myappvol: {}
Comme vous avez dit que vous ne voulez pas modifier le yaml alors cela peut ne pas fonctionner pour vous
Exécuter docker-composer à l'intérieur du docker
Actuellement, vous exécutez docker-compose
sur la machine principale. Vous devez plutôt utiliser docker-compose
dans un autre conteneur de menu fixe qui contient le dossier racine principal.
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD:/rootfs/$PWD" \
-w="/rootfs/$PWD" \
docker/compose:1.13.0 up
Cela fonctionnerait, mais les données seraient conservées à l'intérieur du conteneur de menu fixe lui-même.
Voir l'article ci-dessous pour plus de détails
https://cloud.google.com/community/tutorials/docker-compose-on-container-optimized-os
J'ai eu la même erreur, je l'ai résolue en supprimant le répertoire 'rootfs' lors du montage du conteneur de menu fixe (vous ne pouvez pas écrire sur ce répertoire).
Il suffit de changer:
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD:/rootfs/$PWD" \
-w="/rootfs/$PWD" \
docker/compose:1.13.0 up
Par:
docker run \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD:$PWD" \
-w="$PWD" \
docker/compose:1.13.0 up