何时在docker compose中运行命令,何时在dockerfile中运行?

3

我对Docker还是个新手,所以请谅解我可能会问一些愚蠢的问题。

据我所了解,如果我想拥有一个正在运行的容器而不是可执行文件,那么你最终需要一个“命令”。没问题。

所以,如果我想要一个用于服务Django应用程序的容器,我必须添加类似于下面的内容:

python manage.py runserver 0.0.0.0:8000

现在的问题是: 我们是在定义镜像的Dockerfile末尾添加这个命令吗? 还是在使用该镜像的docker-compose中添加这个命令,就像这样?
services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
[...]
2个回答

2
如果有什么可以放到Dockerfile中的东西,那么你应该把它放在那里(但并非所有东西都可以)。考虑其他运行此容器的方式(docker run;将其放入Kubernetes清单),以及类似的其他环境(例如,在不同主机上维护数据库)。如果每次运行容器时某些内容基本上总是相同的,请将其放入Dockerfile中。
在您提供的示例中,正在构建的镜像是用于Django应用程序的。无论上下文如何,每次运行图像时,您可能总是想运行Django应用程序,并使用完全相同的命令行。因此,请在Dockerfile中放置它。
CMD ./manage.py runserver 0.0.0.0:8000

如果不提供Compose命令、docker run命令、Kubernetes命令或其他部署时的设置,您应该避免这样做。

相反,您的基础数据库存储在每个环境中都是不同的。因此,指定使用环境变量或其他设置指定数据库位置,并将其包含在部署配置中是有意义的。

# in a host development environment
export PGHOST=localhost
pipenv run ./manage.py runserver

# docker-compose.yml
version: '3.8'
services:
  db:
    image: postgres
  app:
    build: .
    environment:
      - PGHOST=db # (not a Dockerfile ENV)
    ports:
      - '8000:8000'

command: 的一个显著例外是如果你有一张图片可以做两件事情。 Django 和 Celery 的结合就是一个很好的例子: 两者将共享大部分相同的代码库,因此要专门运行 Celery 工作程序,你需要运行相同的图片,但使用不同的命令。

version: '3.8'
services:
  redis:
    image: redis
  app:
    build: .
    environment: [REDIS_HOST=redis]
    ports: ['8000:8000']
  worker:
    build: .
    environment: [REDIS_HOST=redis]
    command: celery worker ...

0
你可以创建一个 sh 文件并从 Dockerfile 中触发它。

boot-strap.sh

python manage.py runserver 0.0.0.0:8007

在 Dockerfile 中:
...
ENTRYPOINT ["sh",".../boot-strap.sh"]

通过这种方式,您可以添加其他命令(例如:python manage.py migrate ..)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接