我应该 运行 django 命令在 docker 容器之外还是在 docker 容器 cli

Should i run django commands outside a docker container or in the docker container cli

到目前为止,我刚刚开始对我的 Django 应用程序进行 docker 化,一切进展顺利,但我需要知道 运行 容器内的 Django 命令是否是最佳实践

docker container exec -it con_name python manage.py startup app_name

或者我应该运行它在容器外面

python manage.py startup app_name

谢谢

在我的例子中,我在开发期间在本地 运行 管理命令,如“startapp”,然后我在部署阶段 运行 进行迁移并在容器内迁移,最后我 运行 定期由 celery 管理的第二个容器(相同图像)中的任务。

我会尽可能避免使用 docker exec。它作为调试工具非常有用,但它不应该是与容器交互的正常方式。

您专门谈到启动应用程序。在这里使用普通的 Python 虚拟环境就可以了,忽略 Docker,即使你最终要通过容器部署;与容器数据库配对的主机开发环境也是一个很好的组合。

否则,运行连接服务器应该是Docker文件CMD。服务器将是容器 运行s 的单个进程,如果服务器退出,容器也会退出。

# requires manage.py to be executable and begin with the line
# #!/usr/bin/env python3
CMD ["./manage.py", "runserver", "--host", "0.0.0.0"]

manage.py 脚本可以 运行 提供各种支持命令,例如 运行ning 数据库迁移。有几种方法可以解决这个问题。一个直接的方法是 运行 一个新容器,具有相同的网络设置和数​​据库配置,但有一个备用命令。如果您使用 Compose 启动主服务器,则有一个 docker-compose run 命令可以执行此操作:

docker-compose run myapp \
  ./manage.py migrate

(关于在 Docker 文件中使用 CMDENTRYPOINT 有一个风格问题。我在这里显示的命令替换了 CMD;语法也替换 ENTRYPOINT 更尴尬。如果有选择的话,这是我倾向于选择 CMD 的几个原因之一。)

对于这些支持命令,也可以从主机 运行 获取它们,但是数据库配置之类的东西会有所不同。特别是像 ./manage.py makemigrations 这样想要写回原始源代码树的命令最好从主机 运行