【问题标题】:docker-compose does not start postgresdocker-compose 不启动 postgres
【发布时间】:2016-07-18 05:57:37
【问题描述】:

我正在为一个 django 应用程序创建一个 docker-compose 配置,Dockerfile 构建成功,但是当我组合它们时,django 返回一个问题——无法连接到 postgres。

我运行docker-compose run web bash,发现redis和posgres都无法连接。

我的 docker-compose.yml 文件

web:
 build: .
  ports:
    - "8000:8000"
environment:
  - 'DATABASE_HOST=db'
  - 'DATABASE_NAME=mydb'
  - 'DATABASE_USER=root'
  - 'DATABASE_PASSWORD=root'
links:
  - db
db:
  image: postgres:9.1

运行 sudo docker-compose up 时出现以下错误。

web_1 |   File "/usr/local/lib/python2.7/site packages/django/db/backends/postgresql/base.py", line 175, in  get_new_connection

web_1 |     connection = Database.connect(**conn_params)
web_1 |   File "/usr/local/lib/python2.7/site-packages/psycopg2/__init__.py", line 164, in connect
web_1 |     conn = _connect(dsn, connection_factory=connection_factory, async=async)
web_1 | django.db.utils.OperationalError: could not connect to server: Connection refused
web_1 |     Is the server running on host "localhost" (::1) and accepting
web_1 |     TCP/IP connections on port 5432?
web_1 | could not connect to server: Connection refused
web_1 |     Is the server running on host "localhost" (127.0.0.1) and accepting
web_1 |     TCP/IP connections on port 5432?

【问题讨论】:

  • 你的 Django 设置中有什么东西可以使用这些环境变量来定义数据库吗?
  • 我的 django 设置是:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'aiotadb', 'USER': 'root', 'PASSWORD': 'root', 'HOST': 'db', 'PORT': '5432', } }
  • 还尝试通过更改设置文件中的'HOST':'localhost' 并更改docker-compose.yml 中的'DATABASE_HOST=localhost' 。仍然面临同样的问题。
  • 我不确定你为什么要在 docker-compose.yml 中设置这些值,因为你没有在任何地方使用它们;您已经对设置进行了硬编码。该错误消息清楚地表明它正在尝试访问localhost,而不是db,因此您应该检查您是否确实拥有'HOST': 'db'

标签: django postgresql docker-compose


【解决方案1】:

我还用docker-compose 建立了一个集群,它可能会帮助你并回答你的问题(这里是repo)。您可以看到docker-compose.yml 文件和django settings 文件(我标记了您需要的行)。

您还可以克隆此 repo 并获取 djangoangular2postgresqlnginx 容器,所有这些容器已经链接在一起。

【讨论】:

  • 谢谢@Nir 我也试过这些,但错误仍然是服务器在主机“localhost”(::1)上运行并接受。我有使用 sqlite3 尝试了 docker,它起到了一种魅力。
  • @AshishK。注意我的 docker-compose.yml 文件,我的 server (django) depends_on 数据库。这意味着server 容器将始终等待database 容器并在它之后而不是之前启动。另外,上传您的settings.py 文件,注意我的'HOST': 'database''PORT': 5432(我认为这是您的问题。您的主机应该是数据库容器的名称)。
  • 谢谢。找到问题。现在运行成功。
  • 端口 5432 无法监听任何内容 :)
【解决方案2】:

您正在将您的 web 容器与 postgres 容器链接,但您没有定义数据库名称、密码和用户。

  web:
   build: .
   ports:
    - "8000:8000"
   links:
    - db
  db:
    restart: always
    image: postgres:9.1
    ports:
      - "5432:5432"
    volumes:
      - pgvolume:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=root
      - POSTGRES_DB= aiotadb
      - POSTGRES_USER=root
   data:
    restart: always
    image: postgres:9.1
    volumes:
      - /var/lib/postgresql
    command: tail -f /dev/null

另外,如果您已经在设置文件中定义了数据库选项,则无需在 Web 容器中将其声明为环境变量。

【讨论】:

    【解决方案3】:
    version: '3'
    services:
      basicproject:
        build: .
        container_name: basicproject-container
        depends_on:
          - postgres
        ports:
          - "8000:8000"
    
      postgres:
        image: postgres:9.4
        ports:
        - "5432"
        environment:
          - POSTGRES_USER=test
          - POSTGRES_PASSWORD=testing
          - POSTGRES_DB=test_db
    

    【讨论】:

      【解决方案4】:

      在您的“网络”服务中添加依赖项,如下所示:

      depends_on:
        - db
      

      【讨论】: