Работа в сети с использованием docker-compose в docker executor в circleci

Это вопрос круговорота, я думаю.

Я очень доволен кругом, но теперь у меня возникла проблема, и я не знаю, что я делаю неправильно. Может быть, это очень просто, но я этого не вижу.

Короче

Я не могу заставить контейнеры разговаривать друг с другом по кольцу.

проблема

По сути, я хотел запустить контейнер сервера и клиентский контейнер, а затем позволить им общаться друг с другом. Я создал минимальный пример здесь: https://github.com/mRcSchwering/circleci-integration-test

README.md в основном объясняет желаемый результат. у меня есть .circleci/config.yml как это:

version: 2
jobs:
  build:
    docker:
      - image: docker:18.03.0-ce-git
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: Install docker-compose
          command: |
            apk --update add py2-pip
            /usr/bin/pip2 install docker-compose
            docker-compose --version
      - run:
          name: Start Container
          command: |
            docker-compose up -d
            docker-compose ps
      - run:
          name: Let client talk to server
          command: |
            docker-compose run client psql -h server -p 5432 -U postgres -c "\l"

В докерном контейнере, docker-compose установлен, который затем используется для запуска server и client (Postgres здесь). На последнем этапе я говорю client запросить server, Тем не менее, он не может найти server:

#!/bin/sh -eo pipefail
docker-compose run client psql -h server -p 5432 -U postgres -c "\l"
Starting project_server_1 ... 

^@^@psql: could not connect to server: Connection refused
    Is the server running on host "server" (172.18.0.2) and accepting
    TCP/IP connections on port 5432?
Exited with code 2

файлы

docker-compose.yml выглядит так

version: '2'

services:
  server:
    image: postgres:9.5.12-alpine
    networks:
      - internal
    expose:
      - '5432'
  client:
    build:
      context: .
    networks:
      - internal
    depends_on:
        - server

networks:
  internal:
    driver: bridge

где client построен из Dockerfile, как это

FROM alpine:3.7
RUN apk --no-cache add postgresql-client && rm -rf /var/cache/apk/*

Заметка

Если я повторяю все в моем Linux (также с docker-in-docker), это работает. Но я думаю, что некоторые вещи работают совершенно по-другому на круговоротах. Я обнаружил, что некоторые люди упоминают, что с сеткой кругов и связыванием может быть сложно, но я не нашел ничего, что могло бы мне помочь. Есть этот документ, но я думал, что уже делаю это. Тогда есть этот проект, где кто-то, кажется, делает то же самое на Circleci успешно. Но я не могу понять, что там отличается...

В любом случае, я был бы очень признателен за вашу помощь. Пока что я отказался от этого.

Лучший Марк

1 ответ

Решение

Хорошо, в то же время я (нет, на самом деле это был недоумок с форума Circleci) заметил, что docker-compose run client psql -h server -p 5432 -U postgres -c "\l" был запущен до того, как сервер был запущен и работает. Просто sleep 5 после docker-compose up -d устраняет проблему

Другие вопросы по тегам