【发布时间】: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