python - 在仅限容器的开发环境之外运行 django `makemigrations` 的体面做法是什么
问题描述
我使用基于 Django 的应用程序创建了一个容器,并使用 PostgreSQL 创建了另一个容器,它们以网络方式相互链接,使用docker-compose
.
如果我makemigrations
在我的应用程序 docker 容器(链接到 PostgreSQL 容器)中运行 bash 会话的外部,如下所示:
python manage.py makemigrations myapp
我得到以下异常:
django.db.utils.OperationalError: could not
translate host name "db" to address: nodename
nor servname provided, or not known
这是有道理的:我在容器执行上下文之外没有任何 PostgreSQL 实例(和配置)。
根据我从过去使用其他语言的经验以及类似这篇文章的其他帖子中了解到的情况,我希望运行makemigrations
并提交它。
这将是创建和提交迁移文件的最佳方法:
- 我是否应该尝试公开 PostgreSQL 容器并将其更改
settings.py
DATABASE
为能够makemigrations
从本地 bash 会话运行命令? - 我应该将容器内部执行的结果复制
makemigrations
到我的存储库中然后提交吗? - 我是否应该担心不提交迁移,而是使用
docker-entrypoint.sh
方法(示例)制作并运行它们? - 还有其他选择吗?
解决方案
我最好运行 makemigrations 并提交它。
你是对的,迁移应该始终提交给 repo。
我是否应该尝试公开 PostgreSQL 容器并更改 settings.py 数据库以便能够从本地 bash 会话运行 makemigrations 命令?
我个人不会这样做。
如何接近本地代码和 docker 之间的无缝集成是一个有很多答案的问题。我喜欢将我的代码作为卷挂载到容器中,然后,当你makemigrations
在容器中运行时,创建的迁移也会出现在你的机器上。
像这样的东西docker-compose.yml
app:
...
volumes:
- path/to/local/src/:/src/
working_dir: /src
/src
你的文件夹在哪里manage.py
?现在,当你这样做时
docker exec -it container_name python manage.py makemigrations
它将在您的本地计算机中创建迁移文件,并且您来回复制它不会有问题。
但请注意文件权限,因为在这种情况下,迁移可能是使用 root 所有者创建的,具体取决于您的主机操作系统。但我猜这是另一个问题。
推荐阅读
- methods - Javassist - 为什么在执行过程中被拦截后无法替换方法体?
- multiprocessing - gunicorn 如何决定哪个工人收到请求?
- java - 如何正确使用 Spring Boot 测试?
- php - 使用 php 计算中的变量更新 mysql 数据库表
- javascript - 无法将属性“innerHTML”设置为 null - 似乎没有什么可以修复它
- sql - 小型跟随系统。如何从列中选择两个不同的值
- spring-batch - 带有 Spring 批处理集成的 Seedstack
- macros - 生成嵌套模块错误的球拍宏
- bash - 试图理解`test的行为
` 在 Bash 中 - http - HTTP标头如何指示相对路径