Docker容器无法连接circleCI postgres数据库

问题描述 投票:0回答:1

我正在尝试设置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是一个脚本,该脚本从公司存储库中提取我的docker映像,然后在该映像上运行docker。

我读过其他人在数据库尚未准备就绪时遇到了问题,因此为了测试这一点,我在docker运行之前添加了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个回答
0
投票

EDIT:我已经找到关于您的问题的documentation page

<可以在远程docker中启动服务并直接从主容器ping它,或者启动可以ping远程docker中的服务的主容器。为了解决这个问题,您需要与来自远程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
© www.soinside.com 2019 - 2024. All rights reserved.