JeremyKirkham
JeremyKirkham

Reputation: 1077

Running docker-compose inside a Google Cloud Engine

I'm trying to run a small docker-compose app inside a container-optimized Google Cloud Compute Engine node, but I'm getting stuck when it's trying to mount volumes during a 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 $ 

My docker-compose.yml file looks like this:

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

I don't want to have to change anything in the docker-compose.yml file - I'd prefer to be able to fix this issue by running commands inside the VM itself, or in how I set the VM up. Reason being is it's not my code and I can't change the docker-compose.yml file easily, and all I need to do is run it for a short period of time and execute a few docker-compose commands inside the VM.

Upvotes: 9

Views: 8160

Answers (2)

Jibsgrl
Jibsgrl

Reputation: 95

I had the same error, I solved it by removing the 'rootfs' directory when mounting the docker container (you cannot write on this directory).

Just change:

docker run \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v "$PWD:/rootfs/$PWD" \
    -w="/rootfs/$PWD" \
    docker/compose:1.24.0 up

By:

docker run \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v "$PWD:$PWD" \
    -w="$PWD" \
    docker/compose:1.24.0 up

Add to the bottom of the file .bashrc file located /home/{your-user}/.bashrc using vi or nano: e.g. nano /home/{your-user}/.bashrc

echo alias docker-compose="'"'docker run --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v "$PWD:$PWD" \
    -w="$PWD" \
    docker/compose:1.24.0'"'" >> ~/.bashrc

CTRL O - will save

CTRL M - override

CTRL X - exit

Run: source ~/.bashrc - to update the terminal.

Upvotes: 4

Tarun Lalwani
Tarun Lalwani

Reputation: 146630

Container optimized OS usually mounts most of the paths as read-only. That is why you are getting the error

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

So you have few options

Use named volumes in docker-compose

You will need to change your volumes like below

volumes:
  - myappvol:/myapp

and define the top level volumes in compose

volumes:
  myappvol: {}

As you said you don't want to modify the yaml then this may not work for you

Run docker-compose inside docker

Currently you run docker-compose on the main machine, instead you should use docker-compose inside another docker container which has the main root folder

docker run \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v "$PWD:/rootfs/$PWD" \
    -w="/rootfs/$PWD" \
    docker/compose:1.13.0 up

This would work but the data would be persisted inside the docker container itself.

See below article for more details

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

Upvotes: 5

Related Questions