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

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

如何执行多个命令?


当前回答

你可以在这里使用入口点。docker中的entrypoint在命令之前执行,而命令是容器启动时应该运行的默认命令。所以大多数应用程序通常在入口点文件中携带设置过程,最后允许运行命令。

make shell脚本文件可以是docker-entrypoint.sh(名称无关紧要),其中包含以下内容。

#!/bin/bash
python manage.py migrate
exec "$@"

在docker-compose.yml文件中,将其与entrypoint:/docker-entrypoint.sh一起使用,并将命令注册为命令:python manage.py runserver 0.0.0.0:8000注意:不要忘记将docker-entrypoint.sh与代码一起复制。

其他回答

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

如果您需要运行多个守护进程,Docker文档中建议在非分离模式下使用Supervisord,这样所有子守护进程都将输出到stdout。

从另一个SO问题中,我发现可以将子进程输出重定向到stdout。这样你就能看到所有的输出!

我在一个单独的临时容器中运行启动前的东西,比如迁移(注意,合成文件必须是版本“2”类型):

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

这有助于保持清洁和分离。需要考虑两件事:

您必须确保正确的启动顺序(使用dependents_on)。您希望避免多次构建,这是通过第一次使用构建和图像对其进行标记来实现的;然后可以引用其他容器中的图像。

你可以在这里使用入口点。docker中的entrypoint在命令之前执行,而命令是容器启动时应该运行的默认命令。所以大多数应用程序通常在入口点文件中携带设置过程,最后允许运行命令。

make shell脚本文件可以是docker-entrypoint.sh(名称无关紧要),其中包含以下内容。

#!/bin/bash
python manage.py migrate
exec "$@"

在docker-compose.yml文件中,将其与entrypoint:/docker-entrypoint.sh一起使用,并将命令注册为命令:python manage.py runserver 0.0.0.0:8000注意:不要忘记将docker-entrypoint.sh与代码一起复制。

基于@Bjorn答案,docker最近引入了特殊的依赖规则,允许您等待“init容器”成功退出

db:
  image: postgres
web:
  image: app
  command: python manage.py runserver 0.0.0.0:8000
  depends_on:
    db:
    migration:
      condition: service_completed_successfully
migration:
  build: .
  image: app
  command: python manage.py migrate
  depends_on:
    - db

我不确定你是否还需要buildkit,但在我这边,它可以与

DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 docker-compose up