【问题标题】:Docker-Compose, Django: 'could not translate host name "db" to address: Name or service not known'Docker-Compose,Django:'无法将主机名“db”转换为地址:名称或服务未知'
【发布时间】:2021-10-16 20:25:59
【问题描述】:

我正在尝试通过 Docker-Compose 在 Semaphore-ci 上设置一个带有 Postgres 数据库的 Django 项目。数据库容器似乎没有运行。我收到一条错误消息“django.db.utils.OperationalError:无法将主机名“db”转换为地址:名称或服务未知”。我在下面包含了我的 docker-compose.yml、semaphore.yml 和 settings.py。

docker-compose.yml

version: "3.9"
   
services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python3 ./zenmon/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/opt/app
    ports:
      - "8000:8000"
    depends_on:
      - db

semaphore.yml

# .semaphore/semaphore.yml

version: v1.0
name: Initial Pipeline
agent:
  machine:
    # Use a machine type with more RAM and CPU power for faster container
    # builds:
    type: e1-standard-2
    os_image: ubuntu1804
blocks:
  - name: Build
    task:
      # Mount a secret which defines DOCKER_USERNAME and DOCKER_PASSWORD
      # environment variables.
      # For info on creating secrets, see:
      # https://docs.semaphoreci.com/essentials/using-secrets/
      secrets:
        - name: dockerhub
      jobs:
      - name: Docker build
        commands:
          # Authenticate with Docker Hub
          - 'echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin'
          - sem-version python 3.8
          - checkout
          - mkdir .pip_cache
          - cache restore
          - pip install --cache-dir .pip_cache -r requirements.txt
          - cache store
          - docker-compose build
          - 'docker pull $DOCKER_USERNAME/zenmon:latest || true'
          - 'docker-compose build --cache-from=$DOCKER_USERNAME/zenmon:latest -t $DOCKER_USERNAME/zenmon:latest .'
          - 'docker push $DOCKER_USERNAME/zenmon:latest'
          - docker images

  - name: Run & Test Docker image
    task:
      # Mount a secret which defines DOCKER_USERNAME and DOCKER_PASSWORD
      # environment variables.
      # For info on creating secrets, see:
      # https://docs.semaphoreci.com/essentials/using-secrets/
      secrets:
        - name: dockerhub
      prologue:
        commands:
          # Authenticate with Docker Hub
          - echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
          - sem-version python 3.8  
          - checkout
          - mkdir .pip_cache
          - cache restore
          - pip install --cache-dir .pip_cache -r requirements.txt
          - cache store
          - docker pull "$DOCKER_USERNAME"/zenmon
          - docker-compose up -d --build
      jobs:
      - name: Check Running Images
        commands:
          - docker ps
      - name: Run Unit test
        commands:
          - cd zenmon
          - python3 manage.py makemigrations
          - python3 manage.py migrate
          - python3 manage.py test dashboard.tests.test_models
          - python3 manage.py test dashboard.tests.test_views
          - python3 manage.py test dashboard.tests.test_forms
      - name: Checklist
        commands:
          - cd zenmon
          - python3 manage.py check --deploy
      - name: Style check
        commands:
          - pip install flake8
          - flake8 zenmon/ --max-line-length=127

settings.py(数据库部分)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

我已经尝试过these solutionsthese solutions

任何有关如何解决此问题的建议将不胜感激。

【问题讨论】:

  • docker-compose 在本地工作吗?
  • @Turing85 是的,当我在我的机器上本地运行它时它可以工作
  • 您的“运行单元测试”阶段是否在容器中运行?您能否将测试配置为使用 SQLite 之类的嵌入式数据库,从而不依赖外部资源?

标签: django postgresql docker docker-compose semaphore-ci


【解决方案1】:

尝试使用 'localhost' 作为 HOST 而不是 'db'。您应该在 compose-file 中公开 postgres 的端口,如下所示:

ports:
 - "5432:5432"

【讨论】:

  • 当我尝试这个时,我收到以下错误:django.db.utils.OperationalError: could not connect to server: Connection refused00:01 Is the server running on host "localhost" (127.0.0.1) and accepting00:01 TCP/IP connections on port 5432?'
【解决方案2】:

docker-compose.yml 文件中的端口映射不正确。

docker 容器内的 PostgreSQL 在端口 5432 上运行。但正如我所见,您只映射端口8000

这是你需要使用的:

ports:
    - 8000:8000 # HTTP port
    - 5432:5432 # DB port

语法:

<port on the host>:<container port>

因为默认情况下 PostgreSQL 在端口 5432 上侦听,您至少需要在此表达式的右侧使用此端口。左侧的端口告诉您用于从本地主机连接到数据库的端口。

如果这没有帮助,那么

  1. 登录到 PostgreSQL 容器并尝试从命令行连接到数据库。如果您在容器中安装了telnet comnand,则可以使用此基本测试:telnet 5432

  2. 如果有效,请检查主机上打开的端口。

  3. 如果来自容器的连接不起作用,则意味着您的 postgres 安装不正确。修复它。

  4. 也许您不需要在撰写文件中打开端口 5432,因为您的应用程序在容器中运行并从容器内部连接到数据库。在这种情况下,我确定您的数据库在 Docker 容器中没有正常运行,因此您需要先修复它。

如果您检查了上述人员,但您的应用仍然无法运行,则会提出一个包含额外信息的新问题。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 2020-10-03
    • 2021-08-25
    • 2019-07-31
    • 2023-03-04
    • 1970-01-01
    • 2017-12-16
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多