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

Fil*_*ire 4 python django postgresql makemigrations

我使用基于 Django 的应用程序创建一个容器,使用 PostgreSQL 构建另一个容器,使用docker-compose.

makemigrations如果我在应用程序 docker 容器(链接到 PostgreSQL 容器)内运行bash 会话的外部,如下所示:

python manage.py makemigrations myapp
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

django.db.utils.OperationalError: could not
 translate host name "db" to address: nodename 
nor servname provided, or not known
Run Code Online (Sandbox Code Playgroud)

这是有道理的:我在容器执行上下文之外没有任何 PostgreSQL 实例(和配置)。

根据我过去使用其他语言的经验以及类似这篇文章的经验,我希望运行makemigrations并提交它。

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

  • 我是否应该尝试公开 PostgreSQL 容器并更改settings.py DATABASE为能够makemigrations从本地 bash 会话运行命令?
  • 我应该将makemigrations容器内部执行的结果复制到我的存储库中,然后提交吗?
  • 我是否应该担心不提交迁移,而是使用某种docker-entrypoint.sh方法(示例)进行迁移并运行它们?
  • 还有其他选择吗?

val*_*tev 5

我希望运行 makemigrations 并提交它。

你是对的,迁移应该始终致力于回购。

我是否应该尝试公开 PostgreSQL 容器并更改 settings.py DATABASE 以便能够从本地 bash 会话运行 makemigrations 命令?

我个人不会这样做。

如何在本地代码和docker之间实现近乎无缝的集成是一个有很多答案的问题。我喜欢将我的代码作为卷安装到容器中,然后,当您运行时makemigrations在容器中运行时,创建的迁移也会出现在您的计算机上。

像这样的事情在docker-compose.yml

  app:
    ...
    volumes:
      - path/to/local/src/:/src/
    working_dir: /src
Run Code Online (Sandbox Code Playgroud)

/src你的文件夹在哪里manage.py. 现在,当你这样做时

docker exec -it container_name python manage.py makemigrations它将在您的本地计算机中创建迁移文件,并且您来回复制它不会出现问题。

但请注意文件权限,因为在这种情况下,可能会使用根所有者创建迁移,具体取决于您的主机操作系统。但我想这是为了另一个问题。