Using Docker-Compose, how to execute multiple commands Using Docker-Compose, how to execute multiple commands docker docker

Using Docker-Compose, how to execute multiple commands


Figured it out, use bash -c.

Example:

command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"

Same example in multilines:

command: >    bash -c "python manage.py migrate    && python manage.py runserver 0.0.0.0:8000"

Or:

command: bash -c "    python manage.py migrate    && python manage.py runserver 0.0.0.0:8000  "


I run pre-startup stuff like migrations in a separate ephemeral container, like so (note, compose file has to be of version '2' type):

db:  image: postgresweb:  image: app  command: python manage.py runserver 0.0.0.0:8000  volumes:    - .:/code  ports:    - "8000:8000"  links:    - db  depends_on:    - migrationmigration:  build: .  image: app  command: python manage.py migrate  volumes:    - .:/code  links:    - db  depends_on:    - db

This helps things keeping clean and separate. Two things to consider:

  1. You have to ensure the correct startup sequence (using depends_on).

  2. You want to avoid multiple builds which is achieved by tagging it the first time round using build and image; you can refer to image in other containers then.


I recommend using sh as opposed to bash because it is more readily available on most Unix based images (alpine, etc).

Here is an example docker-compose.yml:

version: '3'services:  app:    build:      context: .    command: >      sh -c "python manage.py wait_for_db &&             python manage.py migrate &&             python manage.py runserver 0.0.0.0:8000"

This will call the following commands in order:

  • python manage.py wait_for_db - wait for the DB to be ready
  • python manage.py migrate - run any migrations
  • python manage.py runserver 0.0.0.0:8000 - start my development server