Django应用程序上带有Postgres的Docker图像返回Django.db.utils.error

Django应用程序上带有Postgres的Docker图像返回Django.db.utils.error,django,postgresql,docker,docker-compose,dockerfile,Django,Postgresql,Docker,Docker Compose,Dockerfile,我想为我的Django项目mysite创建一个Docker映像,它有两个应用程序跟踪和用户。我使用docker build-t mysite来构建我的docker形象。我写了一个Dockerfile,就像dockerhub上写的那样。然后我创建了docker-compose.yml文件和我在docker-compose文件中使用的bash脚本entypoint.sh 这些是我的文件: Dockerfile: FROM django:onbuild COPY entrypoint.sh /ent

我想为我的Django项目mysite创建一个Docker映像,它有两个应用程序跟踪和用户。我使用docker build-t mysite来构建我的docker形象。我写了一个Dockerfile,就像dockerhub上写的那样。然后我创建了docker-compose.yml文件和我在docker-compose文件中使用的bash脚本entypoint.sh

这些是我的文件:

Dockerfile:

FROM django:onbuild

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
docker-compose.yml:

version: '3'

services:
  db:
    image: postgres
    container_name: postgres_container
    environment:
     - POSTGRES_USER=postgres
     - POSTGRES_PASSWORD=postgres
     - POSTGRES_DB=postgres
    ports:
     - 5432:5432
  web:
    image: mysite:latest
    build:
     context: .
     dockerfile: Dockerfile
    container_name: mysite_container
    ports:
      - "8000:8000"
    depends_on:
      - db
    entrypoint: /entrypoint.sh
entrypoint.sh

#!/bin/sh

python manage.py makemigrations
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
exec "$@"
因此,当我想启动整个容器时,我使用了以下命令

docker build .
docker-compose build
docker-compose up
我的postgres_容器成功启动,但mysite_容器抛出以下错误:

mysite_container | Traceback (most recent call last):
mysite_container |   File "manage.py", line 22, in <module>
mysite_container |     execute_from_command_line(sys.argv)
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
mysite_container |     utility.execute()
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/core/management/__init__.py", line 365, in execute
mysite_container |     self.fetch_command(subcommand).run_from_argv(self.argv)
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/core/management/base.py", line 288, in run_from_argv
mysite_container |     self.execute(*args, **cmd_options)
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/core/management/base.py", line 335, in execute
mysite_container |     output = self.handle(*args, **options)
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 79, in handle
mysite_container |     executor = MigrationExecutor(connection, self.migration_progress_callback)
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/db/migrations/executor.py", line 18, in __init__
mysite_container |     self.loader = MigrationLoader(self.connection)
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/db/migrations/loader.py", line 49, in __init__
mysite_container |     self.build_graph()
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/db/migrations/loader.py", line 207, in build_graph
mysite_container |     self.applied_migrations = recorder.applied_migrations()
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/db/migrations/recorder.py", line 61, in applied_migrations
mysite_container |     if self.has_table():
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/db/migrations/recorder.py", line 44, in has_table
mysite_container |     return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 255, in cursor
mysite_container |     return self._cursor()
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 232, in _cursor
mysite_container |     self.ensure_connection()
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
mysite_container |     self.connect()
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/db/utils.py", line 89, in __exit__
mysite_container |     raise dj_exc_value.with_traceback(traceback) from exc_value
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
mysite_container |     self.connect()
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/db/backends/base/base.py", line 194, in connect
mysite_container |     self.connection = self.get_new_connection(conn_params)
mysite_container |   File "/usr/local/lib/python3.4/site-packages/django/db/backends/postgresql/base.py", line 168, in get_new_connection
mysite_container |     connection = Database.connect(**conn_params)
mysite_container |   File "/usr/local/lib/python3.4/site-packages/psycopg2/__init__.py", line 130, in connect
mysite_container |     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
mysite_container | django.db.utils.OperationalError: could not connect to server: Connection refused
mysite_container |      Is the server running on host "localhost" (127.0.0.1) and accepting
mysite_container |      TCP/IP connections on port 5432?
mysite_container | could not connect to server: Cannot assign requested address
mysite_container |      Is the server running on host "localhost" (::1) and accepting
mysite_container |      TCP/IP connections on port 5432?
有人知道我为什么会犯这个错误吗?当我进行docker compose时,我的postgres正在5432端口的本地主机上成功运行,但我的web容器似乎没有检测到这一点。为了能够正确运行mysite_容器,我应该在Docker文件中更改什么


编辑:现在我添加了新的设置\u docker.py,其中我将主机设置为“db”文件,并将环境变量docker\u settings\u MODULE=mysite.settins\u docker添加到docker-compose.yml中的web服务中,容器启动正常,但我没有数据库关系。那么,如何将这些关系迁移到docker?

在django容器中,postgres容器看起来像一个不同的服务器。您不应该使用localhost作为主机名。而是使用容器名称。因此,在django配置中设置:

DATABASES = {
  'default': {
    'HOST': 'db',  # container name for postgres 
     [...]
默认情况下,Compose为应用程序设置单个网络。每个 服务的容器加入默认网络,并且是 可由该网络上的其他容器访问,并可由 它们的主机名与容器名称相同


我将在这里暗中拍摄,并说您的数据库设置在中不正确

它需要类似于:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': '5432',
    }
}
编辑:docker-compose.yml文件直接从上述链接改编:

version: '3'

services:
  db:
    image: postgres
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
  web:
    image: mysite:latest
    build:
    context: .
    dockerfile: Dockerfile
    container_name: mysite_container
    ports:
      - "8000:8000"
    depends_on:
      - db
    entrypoint: /entrypoint.sh

您的数据库设置在settings.py中是什么样子的?它是这样的:DATABASES={'default':{'ENGINE':'django.db.backends.postgresql_psycopg2','NAME':'postgres','USER':'postgres','PASSWORD':'postgres','HOST':'localhost','PORT':'5432',}}此外,我强烈建议您不要使用db名称postgres,除非您确实知道连接到默认db时要做什么。当将postgres作为docker容器运行时,通常只使用一个数据库。在官方postgres docker映像中,默认情况下,该数据库称为postgres。t有什么问题帽子?你知道我是否可以配置docker-compose.yml,使其在settings.py中的主机配置中保持localhost吗?我还尝试将主机更改为“db”,它开始运行迁移,但它也会像以前一样抛出相同的错误。我有一个类似的数据库设置,但我的主机是localhost。我可以配置docker-compose.yml吗在某种程度上,我将在主机配置中保留localhost?我还尝试将主机更改为“db”,它开始运行迁移,但它也会像以前一样抛出相同的错误。@Anzoman从撰写文件中删除容器名称时会发生什么情况?数据库和django应用程序在不同的容器中运行,因此从透视图来看在容器内,postgres主机不是本地主机。@Andrew Graham Yooll当我从撰写文件中删除容器名称时,容器只是得到不同的名称,类似于服务web_1和db_1,但其他名称是相同的。@Andrew Graham Yooll谢谢!容器现在成功启动。但是没有changin还有其他方法吗g主机从“localhost”改为“db”?谢谢。有没有其他方法不将主机从“localhost”改为“db”?是的,总有另一种方法。但是为什么?解决方案就是直接更改一个单词。你可能会以某种方式打开端口。通读docker文档。我发现docker文档的结构非常混乱,但是您可以进行各种自定义网络配置。当然,您也可以在同一个容器中运行postgresql和django。但是为什么数据库的主机名应该是localhost很重要呢?您可以尝试将postgres容器的名称更改为localhost。我不确定这是否是一个有效的名称。这将是一个错误这是对localhost的正常期望。您可能必须更改django容器中的/etc/hosts文件。其他一些文件可能会中断。但是,如果可以使其复杂化,为什么要以简单的方式执行此操作?我希望保留localhost,因为如果将localhost更改为db,我将无法使用python manage.py runserver运行我的django站点如果您的环境不同,请使用environment Variablel 要配置的es。
version: '3'

services:
  db:
    image: postgres
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres
  web:
    image: mysite:latest
    build:
    context: .
    dockerfile: Dockerfile
    container_name: mysite_container
    ports:
      - "8000:8000"
    depends_on:
      - db
    entrypoint: /entrypoint.sh