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

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文档中建议在非分离模式下使用Supervisord,这样所有子守护进程都将输出到stdout。

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

其他回答

想好了,使用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
  "

我遇到了同样的问题,我想在端口3000上运行我的react应用程序,在端口6006上运行故事书,两者都在同一个容器中。

我尝试从Dockerfile作为入口点命令启动,并使用docker compose命令选项。

在花了一些时间之后,决定将这些服务分离到单独的容器中,这很有吸引力

最干净?

---
version: "2"
services:
  test:
    image: alpine
    entrypoint: ["/bin/sh","-c"]
    command:
    - |
       echo a
       echo b
       echo c

另一个想法:

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

我在一个单独的临时容器中运行启动前的东西,比如迁移(注意,合成文件必须是版本“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)。您希望避免多次构建,这是通过第一次使用构建和图像对其进行标记来实现的;然后可以引用其他容器中的图像。