Невозможно получить доступ к Docker-составить контейнеры, созданные внутри Docker
У меня есть docker-compose.yml
файл, который запускает простую службу HTTP echo на порту 8800
,
version: '2'
services:
echo-server:
image: luisbebop/echo-server
container_name: echo-server
ports:
- "8800:8800"
Супер простые вещи. Если я бегу docker-compose up
и запустить на моей локальной машине:
echo "Hello World" | nc 127.0.0.1 8800
Тогда я вижу эхо. Однако: если я запускаю этот же сценарий компоновки внутри контейнера докера через GitLab, он завершается неудачно.
Я попытался привлечь внимание к этой проблеме в GitLab здесь, но с ограниченными результатами: https://gitlab.com/gitlab-org/gitlab-ce/issues/26566
мой .gitlab-ci.yml
файл выглядит так:
---
stages:
- docker_test
services:
- docker:dind
docker_test:
stage: docker_test
image: docker:latest
script:
- docker version
- apk update
- apk add py-pip
- pip install docker-compose
- docker-compose up -d
- sleep 10
- netstat -tulpn
- docker-compose port echo-server 8800
- echo "Hello world" | nc 127.0.0.1 8800
И выход gitlab-ci-multi-runner exec docker --docker-privileged docker_test
является:
$ netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
$ docker-compose port echo-server 8800
0.0.0.0:8800
$ echo "Hello world" | nc 127.0.0.1 8800
ERROR: Build failed: exit code 1
Таким образом, кажется, что эти порты недоступны в контейнере Docker, который отвечает за сервисы docker-compose. Я делаю что-то неправильно?
Я не хочу, чтобы порты отображались на уровне хоста, скорее, я просто хочу, чтобы порты, открытые контейнером Docker, выполняющим сборку, были доступны этому контейнеру.
Host (My Mac) -> GitLab CI Container -> Docker Compose Container exposing 8800
^ Not here ^ I want port 8800 accessible here
Изменить: Далее, если я присоединяю оболочку к работающему контейнеру CI, я вижу:
/ # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab192edf5872 luisbebop/echo-server "/opt/echo-server/..." 2 minutes ago Up About a minute 0.0.0.0:8800->8800/tcp echo-server
/ # netstat -nltup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
Таким образом, он "видит" контейнер, и сопоставления портов выглядят нормально, но на самом деле порт не прослушивает.
1 ответ
Контейнер работает на "узле докера", который, в вашем случае, является другим контейнером, поддерживающим сборку Gitlab:
services:
- docker:dind
Если я не ошибаюсь, его имя хоста docker
, Так что доступ как это:
echo "Hello world" | nc docker 8800
Чтобы выяснить, что является хостом демона docker, используйте это:
script:
- echo $DOCKER_HOST