当前位置:  开发笔记 > 编程语言 > 正文

Gitlab CI运行器无法公开嵌套Docker容器的端口

如何解决《GitlabCI运行器无法公开嵌套Docker容器的端口》经验,为你挑选了2个好方法。

当使用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运行的泊坞容器?



1> VonC..:

gitlab.com文档中的官方gitab-ci是指PostgreSQL的例子

它的工作CI不会尝试连接到localhost,而是尝试连接到服务名称

services关键字仅定义在构建期间运行的另一个docker镜像,并链接到image关键字定义的docker镜像.这允许您在构建期间访问服务映像.

可以在主机名下访问MySQL的服务容器mysql.
因此,为了访问您的数据库服务,您必须连接到命名的主机mysql而不是套接字或localhost.

您可以检查这是否适用于您的情况,并尝试访问您的应用程序服务app:9143而不是localhost:9143.


我实际上是在我的.gitlab-ci.yml中使用`services`处理诸如docker:dind之类的其他事情。但是,我想在测试阶段使用docker-compose的原因是,无需在docker-compose中复制我的MySQL,应用程序和其他相关图像的编排(在测试环境中) .yml`和`.gitlab-ci.yml`。我已经有一个工作正常的Compose文件,我花了一些时间来完善它-并且该文件可以在开发人员机器上运行(而`.gitlab-ci.yml`没有用),因此,如果可能的话,我真的很想重用它。

2> Jason Prawn..:

使用docker:dind容器时,将创建一个容器,并且您的docker-compose容器将在其中进行设置。它将端口公开给docker:dind容器内的localhost 。您不能像localhost在执行代码的环境中那样访问它。

docker设置了一个主机名,供您引用此docker:dind容器。您可以使用检查cat /etc/hosts

而不是引用,localhost:9143您应该使用docker:9143

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有