web-dev-qa-db-fra.com

Exécution de docker-compose dans un moteur Google Cloud

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.

7
JeremyKirkham

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

4
Tarun Lalwani

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
3
Jibsgrl