如果有什么可以放到Dockerfile中的东西,那么你应该把它放在那里(但并非所有东西都可以)。考虑其他运行此容器的方式(
docker run
;将其放入Kubernetes清单),以及类似的其他环境(例如,在不同主机上维护数据库)。如果每次运行容器时某些内容基本上总是相同的,请将其放入Dockerfile中。
在您提供的示例中,正在构建的镜像是用于Django应用程序的。无论上下文如何,每次运行图像时,您可能总是想运行Django应用程序,并使用完全相同的命令行。因此,请在Dockerfile中放置它。
CMD ./manage.py runserver 0.0.0.0:8000
如果不提供Compose命令、docker run命令、Kubernetes命令或其他部署时的设置,您应该避免这样做。
相反,您的基础数据库存储在每个环境中都是不同的。因此,指定使用环境变量或其他设置指定数据库位置,并将其包含在部署配置中是有意义的。
export PGHOST=localhost
pipenv run ./manage.py runserver
version: '3.8'
services:
db:
image: postgres
app:
build: .
environment:
- PGHOST=db
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 ...