2017-09-12 4 views
3

J'essaie d'exécuter une petite application docker-composer à l'intérieur d'un nœud Google Cloud Compute Engine optimisé pour le conteneur, mais je suis coincé lorsqu'il essaie de monter des volumes pendant un docker-compose up :Exécution d'un docker-composer à l'intérieur d'un Google Cloud Engine

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. 
[email protected] ~/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 veux pas avoir à changer quoi que ce soit dans le fichier docker-compose.yml - Je préférerais être en mesure de résoudre ce problème en exécutant des commandes à l'intérieur de la VM elle-même, ou dans la façon dont j'ai mis la VM en place. La raison en est que ce n'est pas mon code et je ne peux pas changer le fichier docker-compose.yml facilement, et tout ce que j'ai à faire est de l'exécuter pendant une courte période et d'exécuter quelques commandes docker-composer à l'intérieur de la VM.

Répondre

2

Le système d'exploitation optimisé pour les conteneurs monte généralement la plupart des chemins en lecture seule. C'est la raison pour laquelle vous obtenez l'erreur

source path '/rootfs/home/jeremy/lightning': mkdir /rootfs: read-only file sys 

Vous avez quelques options

Utilisez volumes nommés dans docker-Compose

Vous devrez changer vos volumes comme ci-dessous

volumes: 
    - myappvol:/myapp 

et de définir les volumes de niveau supérieur dans composer

volumes: 
    myappvol: {} 

Comme vous avez dit que vous ne voulez pas modifier le yaml cela peut ne pas fonctionner pour vous

Run docker-Compose l'intérieur docker

Actuellement vous exécutez docker-compose sur la machine principale, au lieu vous devez utiliser docker-compose dans un autre récipient docker qui a le principal dossier racine

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 seront persisté à l'intérieur du docker container lui-même.

Voir ci-dessous l'article pour plus de détails

https://cloud.google.com/community/tutorials/docker-compose-on-container-optimized-os

+0

Salut Tarun, merci pour votre réponse. Je cours déjà cette commande exacte - j'ai suivi le tutoriel de Google sur docker-composer. – JeremyKirkham

+0

Possibilité de préparer les montages uniquement en ajoutant ': ro' dans le fichier de composition? Donc, le problème peut être testé –

+0

Malheureusement, je n'ai pas accès en écriture au fichier docker-compose.yml – JeremyKirkham