我正在尝试设置一个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容器内部进行连接。
我在这里很困惑,所以任何帮助都是有用的。
答案 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
。