简体   繁体   English

GitLab CI:如何连接到 .gitlab-ci.yml 脚本中启动的 docker 容器?

[英]GitLab CI: how to connect to the docker container started in .gitlab-ci.yml script?

Initial task初始任务

In my GitLab CI build, I want to:在我的 GitLab CI 构建中,我想:

  • Start a docker container with local AmazonDB.使用本地 AmazonDB 启动 docker 容器。 Standard port layout: port 8000 in docker, port 8000 exposed.标准端口布局:docker 8000端口, 8000端口暴露。 Of course, everything works locally, I can connect ( curl , awc-cli , Java code for Amazon DB, whatever you wish).当然,一切都在本地运行,我可以连接( curlawc-cli 、Amazon DB 的 Java 代码,无论您想要什么)。
  • Use it for tests, ie connect to it as --endpoint-url http://localhost:8000 (or any other mapped IP instead of localhost ).将它用于测试,即以--endpoint-url http://localhost:8000 (或任何其他映射 IP 而不是localhost )的形式连接到它。

Problem问题

.gitlab-ci.yml looks like this: .gitlab-ci.yml看起来像这样:

image: docker:stable

build/test:
  tags:
    - gradle
    - eu

  stage: test

# doesn't work with or without it
#  services:
#    - docker:dind

  script:
    # display local running containers
    - echo Displaying all running docker containers with "amazon/dynamodb-local" image...
    - docker ps --filter ancestor=amazon/dynamodb-local

    # stop all running docker containers with "amazon/dynamodb-local" image
    - echo Stopping all Docker containers with "amazon/dynamodb-local" image...
    - CONTAINERS=$(docker ps -q --filter ancestor=amazon/dynamodb-local)
    - >
      if [ "${CONTAINERS}" == "" ]; then
        echo No docker containers with "amazon/dynamodb-local" image running. Nothing to stop.
      else
        docker stop $(docker ps -q --filter ancestor=amazon/dynamodb-local)
        echo All Docker containers with "amazon/dynamodb-local" image stopped.
      fi

    # start DynamoDB local as a docker container with shared database
#    - java -Djava.library.path=./dynamodb_local_latest/DynamoDBLocal_lib -jar ./dynamodb_local_latest/DynamoDBLocal.jar -sharedDb
    # relative path to causes "Error: Unable to access jarfile" for both windows and linux
    # run Docker in detached mode to not hang on the opened console
    - cd ./dynamodb_local_latest
    - docker run --detach -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDb
    - cd ./..

    # display local running containers
    - echo Displaying all running docker containers with "amazon/dynamodb-local" image...
    - docker ps --filter ancestor=amazon/dynamodb-local

    # see https://stackoverflow.com/questions/45389116/unable-to-access-docker-compose-containers-created-inside-docker
    # $DOCKER_HOST is unix:///var/run/docker.sock
    # http://localhost:8080 fails
    # http://docker:8000 fails
    # http://unix:///var/run/docker.sock:8000 fails
    - echo docker host is ${DOCKER_HOST}
    - cat /etc/hosts
#    - curl docker:80 | true
#    - curl docker:8000 | true
#    - curl http://docker:8000 | true
#    - curl http://docker:8000 | true
#    - curl ${DOCKER_HOST} | true
#    - curl ${DOCKER_HOST}:8000 | true
    - curl localhost:8000 | true
    - curl http://localhost:8000 | true

    # stop all running docker containers with "amazon/dynamodb-local" image
    - echo Stopping all Docker containers with "amazon/dynamodb-local" image...
    - CONTAINERS=$(docker ps -q --filter ancestor=amazon/dynamodb-local)
    - >
      if [ "${CONTAINERS}" == "" ]; then
        echo No docker containers with "amazon/dynamodb-local" image running. Nothing to stop.
      else
        docker stop $(docker ps -q --filter ancestor=amazon/dynamodb-local)
        echo All Docker containers with "amazon/dynamodb-local" image stopped.
      fi

    # display local running containers
    - echo Displaying all running docker containers with "amazon/dynamodb-local" image...
    - docker ps --filter ancestor=amazon/dynamodb-local

Critical execution points (Gitlab-CI log) look like this:关键执行点(Gitlab-CI 日志)如下所示:

Docker container runs: Docker 容器运行:

$ docker run --detach -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDb
c823489c22fffa603c1ae1b91d898cb7de4964774d54a08c9fdf0b891c2243b4
$ echo Displaying all running docker containers with "amazon/dynamodb-local" image...
Displaying all running docker containers with amazon/dynamodb-local image...
$ docker ps --filter ancestor=amazon/dynamodb-local
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                  PORTS                    NAMES
c823489c22ff        amazon/dynamodb-local   "java -jar DynamoDBL…"   1 second ago        Up Less than a second   0.0.0.0:8000->8000/tcp   peaceful_beaver

curl fails (tried all possible variations, this is just an example): curl 失败(尝试了所有可能的变化,这只是一个例子):

$ curl localhost:8000 | true
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (7) Failed to connect to localhost port 8000: Connection refused
Authenticating with credentials from $DOCKER_AUTH_CONFIG
ERROR: Job failed: exit code 7

I tried with and without我试过有没有

  services:
    - docker:dind

Tried with host names localhost or docker or tcp://localhost , with http:// prefix or without it, with ports 80 , 8000 or 2375 .尝试使用主机名localhostdockertcp://localhost ,带http://前缀或不带前缀,端口为8080002375 Nothing works.什么都行不通。

Value of ${DOCKER_HOST} is unix:///var/run/docker.sock : ${DOCKER_HOST}unix:///var/run/docker.sock

$ echo docker host is ${DOCKER_HOST}
docker host is unix:///var/run/docker.sock

/etc/hosts does not contain an alias for docker /etc/hosts不包含docker的别名

$ cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3  runner-H3HL9s9t-project-913-concurrent-0

Questions问题

  • How to solve this typical task?如何解决这个典型的任务?
  • Is it solvable with docker run , or complex docker-compose usage required.是否可以使用docker run ,或者需要复杂的docker-compose使用。
  • Is there a link to a working example?是否有工作示例的链接?
  • Is it a problem, that there is no docker alias in /etc/hosts ?问题是/etc/hosts没有docker别名吗?
  • Is unix:///var/run/docker.sock a valid value of ${DOCKER_HOST} ? unix:///var/run/docker.sock${DOCKER_HOST}的有效值吗? Shouldn't the value for this variable be set in variables of .gitlab-ci.yml (particularly to tcp://localhost:2375 )?如果不是这个变量的值中设置variables.gitlab-ci.yml (特别是tcp://localhost:2375 )?

Links链接

There are multiple links that I've googled.我在谷歌上搜索了多个链接。 Solutions from there haven't helped me for now.那里的解决方案暂时没有帮助我。

There is actually no need in writing such a complex solution with manual docker run / docker stop inside the -script section.实际上没有必要在-script部分中使用手动docker run / docker stop编写如此复杂的解决方案。 The slim and simple way is to use the local DynamoDB as service .苗条和简单的方法是使用本地 DynamoDB 作为service

With this script, local DynamoDB will be accessible via url from alias of the services element, ie dynamodb-local for this example:使用此脚本,本地 DynamoDB 将可以通过来自services元素alias的 url 访问,即本示例中的dynamodb-local

  services:
    - name: amazon/dynamodb-local
      alias: dynamodb-local

Executing aws dynamodb with http://dynamodb-local:8000 endpoint url works:使用http://dynamodb-local:8000端点 url 执行aws dynamodb有效:

  script:
    - DYNAMODB_LOCAL_URL=http://dynamodb-local:8000
    - apk add --no-cache curl jq python py-pip
    - pip install awscli
    - aws dynamodb list-tables --endpoint-url ${DYNAMODB_LOCAL_URL} --region eu-central-1

This option was found in this great answer.这个选项是在这个很好的答案中找到的。 Many thanks to @madhead for providing it!非常感谢@madhead提供它!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM