gpt4 book ai didi

django - 何时在 docker compose 中运行命令以及何时在 dockerfile 中运行命令?

转载 作者:行者123 更新时间:2023-12-05 04:45:50 29 4
gpt4 key购买 nike

我是 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
[...]

最佳答案

如果将某些内容放入 Dockerfile 是有意义的,那么您应该将它放在那里(但并非所有内容都有意义)。想想你可以运行这个容器的其他方式( docker run ;把它放在 Kubernetes list 中)以及你可以运行它的类似其他环境(例如,数据库在不同的主机上维护)。如果每次运行容器时基本上总是相同的内容,请将其放入 Dockerfile。

在您提供的示例中,您构建的图像是用于 Django 应用程序的。无论何时运行图像,无论上下文如何,您可能总是想要运行 Django 应用程序,并且正是使用该命令行。所以放入Dockerfile

CMD ./manage.py runserver 0.0.0.0:8000

并且不提供 Compose command: , docker run命令,Kubernetes command: ,或其他部署时设置。

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

# 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: 的一个值得注意的异常(exception)如果你有一个可以做两件事的图像。结合 Django 和 Celery 就是一个很好的例子:两部分将共享大部分相同的代码库,因此要专门运行 Celery worker,您需要运行相同的图像但使用不同的命令。

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 ...

关于django - 何时在 docker compose 中运行命令以及何时在 dockerfile 中运行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69036887/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com