【问题标题】:Docker container can't connect circleCI postgres databaseDocker容器无法连接circleCI postgres数据库
【发布时间】:2019-10-31 09:41:25
【问题描述】:

我正在尝试设置 circleCI 测试,我在 circleCI 中创建了一个数据库,并且我有一个需要连接到数据库的 docker 容器,但它不能。在我的 docker 容器内部是一个脚本,它在执行任何操作之前运行 pg_isready,它无法连接到数据库。这是我的圈子工作创建

   postgres_tests:
    docker:
      - image: circleci/python:3.7
      - image: circleci/postgres:9.6.2-alpine
        environment:
           POSTGRES_USER: postgres
          POSTGRES_DB: my_test
    steps:
      - setup_remote_docker:
          docker_layer_caching: true
      - attach_workspace:
          at: /tmp/workspace
      - run:
          name: Install awscli docker-squash
          working_directory: /
          command: sudo pip3 install awscli docker-squash
      - run: eval `aws ecr get-login --no-include-email --region eu-west-1`
      - checkout
      - run: echo 'export PATH=/usr/lib/postgresql/9.6/bin/:$PATH' >> $BASH_ENV
      - run: sudo apt-get update && sudo apt-get install -y postgresql-client
      - run: psql -h localhost -U postgres --command "ALTER USER postgres WITH PASSWORD 'password';"
      - run:
          name: run_pg_tests
          working_directory: /tmp/workspace
          command: |
            /tmp/workspace/sql/t/run_tests.sh

run_tests.sh 是一个脚本,它从公司 repo 中提取我的 docker 镜像,然后在该镜像上运行 docker。

我读过其他人有数据库没有准备好的问题,所以为了测试这个我在 docker run 之前添加了 pg_isready

所以我的脚本是这样的

DB_HOST=`psql -X -A -h localhost -U postgres -p 5432 -t -c "select inet_server_addr()"`
DB_PORT=5432
DB_NAME=my_test
DB_USER=postgres
DB_PASSWORD=password


pg_isready -h "${DB_HOST}" -p "${DB_PORT}"

#restore database from supplied image
docker run \
    -e SAPIENTIA_DB_HOST=$DB_HOST \
    -e SAPIENTIA_DB_PORT=$DB_PORT \
    -e SAPIENTIA_DB_NAME=$DB_NAME \
    -e SAPIENTIA_DB_PASSWORD=$DB_PASSWORD \
    -e SAPIENTIA_DB_USER=$DB_USER \
    $EMPTY_DB_FULL_PATH \
    path_to_file/file

我也试过将 DB_HOST 变量直接设置为 'localhost' 结果完全一样

这是我得到的结果:

127.0.0.1:5432 - accepting connections

127.0.0.1:5432 - no response

我还尝试使用 ssh 重新运行测试并连接自己。结果相同,我可以连接到数据库,但是我然后运行 ​​docker exec 并尝试从无法连接的 docker 容器内部进行连接。

我在这里很困惑,所以任何帮助都会很有用。

【问题讨论】:

    标签: postgresql docker circleci


    【解决方案1】:

    编辑:我发现这个documentation page 关于您的问题:

    不可能在远程 docker 中启动服务并直接从主容器 ping 它,或者启动可以在远程 docker 中 ping 服务的主容器。为了解决这个问题,你需要通过远程 docker 以及同一个容器与服务进行交互

    那条线对我来说不是 100% 清楚,但我知道他们告诉我们应该手动运行我们想要从另一个容器进行通信的容器。因此:

    - run:
        name: run_pg_tests
        working_directory: /tmp/workspace
        command: |
        docker run -d --name postgres --env POSTGRES_USER=postgres --env POSTGRES_DB=my_test circleci/postgres:9.6.2-alpine
        /tmp/workspace/sql/t/run_tests.sh
    

    由于无法再通过本地网络访问 postgres 容器,因此您的向上检查可能是 docker exec postgres pg_isready

    然后您可以在运行脚本中将DB_HOST 设置为postgres


    原答案:

    我不太熟悉 CircleCI 配置,但我猜你手动运行的 Docker 容器与 CircleCI 启动的容器没有连接到同一个网络。

    根据我在文档中看到的,您可以specify the hostname of the service container

    可以访问容器的名称。默认情况下,容器服务可以通过 localhost 访问

    所以也许你可以试试这个:

    - image: circleci/postgres:9.6.2-alpine
      name: postgres
      environment:
        POSTGRES_USER: postgres
        POSTGRES_DB: my_test
    

    然后,您可以在运行脚本中将 DB_HOST 设置为 postgres

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多