使用Docker-Compose,如何执行多个命令

我想要做这样的事情,我可以按顺序运行多个命令。

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 

想通了,用bash -c

例:

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

我像一个单独的临时容器中运行启动前的东西像迁移(注意,撰写文件必须是版本'2'types):

 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 

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

  1. 您必须确保正确的启动顺序(使用depends_on)

  2. 你想避免多次构build,这是通过使用构build和图像的第一次标记来实现的; 那么你可以在其他容器中引用图像

另一个想法:

如果像在这种情况下一样,只需在其中创build一个启动脚本并使用命令运行该容器。 或者将启动脚本安装为卷。

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

创build一个shell脚本文件可能是docker-entrypoint.sh (名字不重要),其中包含以下内容。

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

在docker-compose.yml文件中使用entrypoint: /docker-entrypoint.sh并注册命令作为command: python manage.py runserver 0.0.0.0:8000 PS:不要忘记复制docker-entrypoint.sh以及你的代码。

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

如果你需要运行一个以上的守护进程, Docker文档中有一个build议,在未分离的模式下使用Supervisord ,这样所有的子守护进程都会输出到stdout。

从另一个SO问题,我发现你可以将subprocess输出redirect到stdout。 这样你可以看到所有的输出!

从Docker Compose版本2(包括3)开始,可以像在Dockerfile一样指定参数列表

 version: '3' # version: '2' services: app: image: foo:1-bar command: ["foo", "bar", "baz"] 

虽然这不是完全相关的问题,在这里张贴它帮助某人。 如果要在容器启动之前运行命令,则可以正常运行容器。 然后login到容器并进行更改。 然后,您可以将容器提交为新图像。 这个新的图像可以用来确保在启动容器之前存在所有必要的更改。

尝试使用“;” 分开命令,如果你是在两个例如

command: "sleep 20; echo 'a'"