我有一个docker-compose.yml文件,它在端口8800上启动一个简单的HTTP服务。
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 8800gitlab-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因此,看起来这些端口在码头容器中是不可用的,后者负责码头-组合服务。我做错了什么吗?
我不希望在主机级别公开端口,而是希望由运行构建的码头容器打开的端口对该容器可用。
Host (My Mac) -> GitLab CI Container -> Docker Compose Container exposing 8800
^ Not here ^ I want port 8800 accessible here 编辑:,如果我将一个shell附加到正在运行的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所以它“看到”了容器,端口映射看起来也不错,但是端口实际上并没有监听。
发布于 2017-07-31 13:05:11
容器在"docker主机“上运行,在您的例子中,这是支持Gitlab构建的另一个容器:
services:
- docker:dind如果我没有错,它的主机名是docker。因此,访问情况如下:
echo "Hello world" | nc docker 8800要弄清楚什么是docker守护进程的主机,请使用以下命令:
script:
- echo $DOCKER_HOSThttps://stackoverflow.com/questions/45389116
复制相似问题