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

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

如何执行多个命令?


当前回答

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

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

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

其他回答

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

如果其他人试图使用基于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;…”

这是我解决这个问题的方法:

services:
  mongo1:
    container_name: mongo1
    image: mongo:4.4.4
    restart: always
#    OPTION 01:
#    command: >
#      bash -c "chmod +x /scripts/rs-init.sh
#      && sh /scripts/rs-init.sh"
#    OPTION 02:
    entrypoint: [ "bash", "-c", "chmod +x /scripts/rs-init.sh && sh /scripts/rs-init.sh"]
    ports:
      - "9042:9042"
    networks:
      - mongo-cluster
    volumes:
      - ~/mongors/data1:/data/db
      - ./rs-init.sh:/scripts/rs-init.sh
      - api_vol:/data/db
    environment:
      *env-vars
    depends_on:
      - mongo2
      - mongo3

我建议使用sh而不是bash,因为它在大多数基于Unix的映像(alpine等)上更容易使用。

下面是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"

这将按顺序调用以下命令:

python manage.py wait_for_db-等待数据库准备就绪python manage.py migrate-运行任何迁移python manage.py runserver 0.0.0.0:8000-启动我的开发服务器

如果您是第二版,请尝试使用“;”分隔命令例如

命令:“sleep 20;echo'a'”