0

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

码头工人-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

信号量.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,
    }
}

我已经尝试过这些解决方案这些解决方案

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

4

2 回答 2

0

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

ports:
 - "5432:5432"
于 2021-08-13T15:28:36.573 回答
0

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

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

这是您需要使用的:

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

句法:

<port on the host>:<container port>

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

如果这没有帮助,那么

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

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

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

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

如果您检查了上面提到的员工并且您的应用程序仍然无法运行,则会提出一个带有额外信息的新问题。

我希望这对你有帮助。

于 2021-08-14T11:29:10.663 回答