4

我使用基于 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方法(示例)制作并运行它们?
  • 还有其他选择吗?
4

1 回答 1

5

我最好运行 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 所有者创建的,具体取决于您的主机操作系统。但我猜这是另一个问题。

于 2018-12-26T18:04:33.293 回答