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

时间:2019-10-31 09:41:25

标签: postgresql docker circleci

我正在尝试设置一个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容器内部进行连接。

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

1 个答案:

答案 0 :(得分:0)

编辑:我找到了有关您的问题的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