当使用GitLab CI以及它时gitlab-ci-multi-runner
,我无法获得内部启动的Docker容器以将其端口暴露给"主机",这是运行构建的Docker映像.
我的.gitlab-ci.yml
档案:
test: image: docker stage: test services: - docker:dind script: - APP_CONTAINER_ID=`docker run -d --privileged -p "9143:9143" appropriate/nc nc -l 9143` - netstat -a - docker exec $APP_CONTAINER_ID netstat -a - nc -v localhost 9143
我的命令:
gitlab-ci-multi-runner exec docker --docker-privileged test
输出:
$ netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 runner--project-1-concurrent-0:54664 docker:2375 TIME_WAIT tcp 0 0 runner--project-1-concurrent-0:54666 docker:2375 TIME_WAIT Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path $ docker exec $APP_CONTAINER_ID netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:9143 0.0.0.0:* LISTEN Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path $ nc -v localhost 9143 ERROR: Build failed: exit code 1 FATAL: exit code 1
我在这做错了什么?
原始问题跟随 - 上面是一个更短,更容易测试的例子
我有一个监听端口的应用程序映像9143
.它的启动和配置是通过管理docker-compose.yml
,并在我的本地机器上运行良好docker-compose up
- 我可以localhost:9143
毫无问题地访问它.
但是,当gitlab.com
通过共享运行器在GitLab CI(版本)上运行时,端口似乎不会暴露.
我的相关部分.gitlab-ci.yml
:
test: image: craigotis/buildtools:v1 stage: test script: - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com/craigotis/myapp - docker-compose up -d - sleep 60 # a temporary hack to get the logs - docker-compose logs - docker-machine env - docker-compose port app 9143 - netstat -a - docker-compose ps - /usr/local/bin/wait-for-it.sh -h localhost -p 9143 -t 60 - cd mocha - npm i - npm test - docker-compose down
输出是:
$ docker-compose logs ... app_1 | [Thread-1] INFO spark.webserver.SparkServer - == Spark has ignited ... app_1 | [Thread-1] INFO spark.webserver.SparkServer - >> Listening on 0.0.0.0:9143 app_1 | [Thread-1] INFO org.eclipse.jetty.server.Server - jetty-9.0.z-SNAPSHOT app_1 | [Thread-1] INFO org.eclipse.jetty.server.ServerConnector - Started ServerConnector@6919dc5{HTTP/1.1}{0.0.0.0:9143} ... $ docker-compose port app 9143 0.0.0.0:9143 $ netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 runner-e11ae361-project-1925166-concurrent-0:53646 docker:2375 TIME_WAIT tcp 0 0 runner-e11ae361-project-1925166-concurrent-0:53644 docker:2375 TIME_WAIT tcp 0 0 runner-e11ae361-project-1925166-concurrent-0:53642 docker:2375 TIME_WAIT Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path $ docker-compose ps stty: standard input: Not a tty Name Command State Ports ---------------------------------------------------------------------------------------- my_app_1 wait-for-it.sh mysql_serve ... Up 8080/tcp, 0.0.0.0:9143->9143/tcp mysql_server docker-entrypoint.sh --cha ... Up 3306/tcp $ /usr/local/bin/wait-for-it.sh -h localhost -p 9143 -t 60 wait-for-it.sh: waiting 60 seconds for localhost:9143 wait-for-it.sh: timeout occurred after waiting 60 seconds for localhost:9143
我的内容docker-compose.yml
:
version: '2' networks: app_net: driver: bridge services: app: image: registry.gitlab.com/craigotis/myapp:latest depends_on: - "db" networks: - app_net command: wait-for-it.sh mysql_server:3306 -t 60 -- java -jar /opt/app*.jar ports: - "9143:9143" db: image: mysql:latest networks: - app_net container_name: mysql_server environment: - MYSQL_ALLOW_EMPTY_PASSWORD=true
它看起来像我的应用程序容器被监听9143
,它的正确曝光到共享GitLab亚军,但它似乎并没有真正被暴露.它工作正常,我的本地机器上-是有一些特殊的解决办法/ TWEAK我需要做这项工作里面上GitLab运行的泊坞容器?
gitlab.com文档中的官方gitab-ci是指PostgreSQL的例子
它的工作CI不会尝试连接到localhost,而是尝试连接到服务名称
该
services
关键字仅定义在构建期间运行的另一个docker镜像,并链接到image关键字定义的docker镜像.这允许您在构建期间访问服务映像.可以在主机名下访问MySQL的服务容器
mysql
.
因此,为了访问您的数据库服务,您必须连接到命名的主机mysql
而不是套接字或localhost
.
您可以检查这是否适用于您的情况,并尝试访问您的应用程序服务app:9143
而不是localhost:9143
.
使用docker:dind
容器时,将创建一个容器,并且您的docker-compose容器将在其中进行设置。它将端口公开给docker:dind
容器内的localhost 。您不能像localhost
在执行代码的环境中那样访问它。
docker
设置了一个主机名,供您引用此docker:dind
容器。您可以使用检查cat /etc/hosts
。
而不是引用,localhost:9143
您应该使用docker:9143
。