Docker-контейнер не может подключиться к базе данных circleCI postgres - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь настроить тест circleCI, я создал базу данных в circleCI и у меня есть док-контейнер, который должен подключиться к базе данных, но не может. Внутри моего 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 - это скрипт, который извлекает мой образ докера из репозитория компании, а затем запускает докер для этого образа.

Я читал, что у других людей есть проблемы, когда база данных не готова, поэтому, чтобы проверить это, я добавил 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 и пытаюсь подключиться изнутри контейнера докера, который он не может подключить.

Я здесь довольно тупой, поэтому любая помощь будет полезна.

1 Ответ

0 голосов
/ 31 октября 2019

РЕДАКТИРОВАТЬ : Я нашел эту страницу документации о вашей проблеме:

Это не возможно начатьслужбы в удаленном докере и пропингуют его непосредственно из основного контейнера или запускают основной контейнер, который может пропинговать сервис в удаленном докере. Чтобы решить эту проблему, вам нужно будет взаимодействовать со службой из удаленного докера, а также через один и тот же контейнер

Эта строка мне не ясна на 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.

Из того, что я вижу в документации, вы можете указать имя хоста сервисного контейнера :

Имя, по которому контейнер доступен. По умолчанию контейнерные сервисы доступны через localhost

Так что, возможно, если вы попробуете что-то вроде этого:

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

Затем вы можете установить DB_HOST на postgres в вашемзапустить скрипт.

...