我想这样做,我可以在下面的代码中运行多个命令:

db:
  image: postgres
web:
  build: .
  command: python manage.py migrate
  command: python manage.py runserver 0.0.0.0:8000
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - db

如何执行多个命令?


当前回答

使用一个工具,例如等待或码头化。这些是可以包含在应用程序图像中的小型包装脚本。或者编写自己的包装脚本来执行更特定于应用程序的命令。根据:https://docs.docker.com/compose/startup-order/

其他回答

这个线程中已经有很多很好的答案,然而,我发现其中的一些组合似乎最有效,尤其是对于基于Debian的用户。

services:
  db:
    . . . 
  web:
    . . .
    depends_on:
       - "db"
    command: >      
      bash -c "./wait-for-it.sh db:5432 -- python manage.py makemigrations
      && python manage.py migrate
      && python manage.py runserver 0.0.0.0:8000"

先决条件:将wait-for-it.sh添加到项目目录中。

来自文档的警告:“(当在生产环境中使用wait for it.sh时),您的数据库可能随时不可用或移动主机……(此解决方案适用于不需要这种弹性的人)。”

编辑:

这是一个很酷的短期解决方案,但对于长期解决方案,您应该尝试在Dockerfile中为每个图像使用入口点。

如果其他人试图使用基于Windows的容器计算多个命令,则以下格式有效:命令:“cmd.exe/c调用c:\Temp/script1.bat&&dir&&c:/Temp/script2.bat&&…”

包括“呼叫”指令是我修复它的原因。

或者,如果每个命令都可以在没有前面命令的情况下执行,则只需用分号分隔每个命令:命令:“cmd.exe/c调用c:\Temp/script1.bat;dir;c:\Temp/sscript2.bat;…”

想好了,使用bash-c。

例子:

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

多行中的相同示例:

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
  "

另一个想法:

如果像本例一样,构建容器,只需在其中放置一个启动脚本,然后使用命令运行它。或者将启动脚本装载为卷。

使用一个工具,例如等待或码头化。这些是可以包含在应用程序图像中的小型包装脚本。或者编写自己的包装脚本来执行更特定于应用程序的命令。根据:https://docs.docker.com/compose/startup-order/