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

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与代码一起复制。

其他回答

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

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

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

要在Windows容器上运行:

创建.bat文件(使用cmd运行,或者如果容器中有.ps1,则可以使用powershell运行)在命令或入口点中,使用myFile.bat(或myFile.ps1)

贝娄我的码头组合.yml:

version: "3.4"

services:
  myservicename:
    image: mcr.microsoft.com/dotnet/sdk:6.0 
    container_name: mycontainername
    environment:
      - PORT=44390
    command: buildAndRun.bat
[...]

我的buildAndRun.bat:

dotnet --list-sdks
dotnet build
dotnet run

这个线程中已经有很多很好的答案,然而,我发现其中的一些组合似乎最有效,尤其是对于基于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中为每个图像使用入口点。

基于Alpine的图像实际上似乎没有安装bash,但您可以使用sh或ash链接到/bin/busybox。

docker-compose.yml示例:

version: "3"
services:

  api:
    restart: unless-stopped
    command: ash -c "flask models init && flask run"