在纯容器开发环境之外 运行 django `makemigrations` 的正确做法是什么

What is a decent practice for running django `makemigrations` outside of a container-only dev environment

我使用基于 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 并提交它。

创建和提交迁移文件的最佳方法是:

it would be desirable for me to run makemigrations and commit it.

你是对的,迁移应该始终提交给 repo。

Should I try to expose the PostgreSQL container and change the settings.py DATABASE to be able to run the makemigrations command from a local bash session?

我个人不会这样做。

如何接近本地代码和 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 它将在您的本地计算机上创建迁移文件,来回复制它不会有问题。

不过要注意文件权限,因为在这种情况下,迁移可能会根据您的主机 OS 使用 root 所有者创建。但我想这是另一个问题。