Comment trouver l'URL de docker-in-docker s'exécutant dans gitlab

Sep 02 2020

J'ai une nouvelle application (https://gitlab.com/connorbutch/reading-comprehension/-/tree/5-implement-glue-codeoù je travaille actuellement à partir de la branche 5-implémenter-glue-code ) qui s'exécute dans docker (pour l'instant, il fonctionnera éventuellement en knative). L'application se construit (à la fois localement et sur le serveur gitlab ci / cd) et déploie une image docker (à la fois localement et sur le serveur gitlab ci / cd). Il passe également les tests d'acceptation localement. Cependant, lorsqu'il exécute les tests d'acceptation sur le serveur gitlab ci / cd, il semble que le déploiement de docker n'est pas exposé / se déroule sur un autre hôte / url .....?

Si vous souhaitez l'exécuter localement, vous pouvez facilement le faire avec une seule commande (après le clonage / cd vers le dépôt):) docker run -i --rm -p 8080:8080 registry.gitlab.com/connorbutch/reading-comprehension & ./wait-for-it-2.sh. Sinon, vous pouvez recréer par cd vers le dépôt et en cours d'exécution./build-it.sh

Voici une sortie de la compilation défaillante sur le serveur gitlab (lors de l'exécution de la commande mentionnée ci-dessus docker run -i --rm -p 8080:8080 registry.gitlab.com/connorbutch/reading-comprehension & ./wait-for-it-2.sh). Vous pouvez trouver cette sortie ici:https://gitlab.com/connorbutch/reading-comprehension/-/jobs/714867229

_  ____  __  _____   ___  __ ____  ______ 
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2020-09-01 22:25:39,509 INFO  [io.quarkus] (main) reading-comprehension-server-quarkus-impl    1.0.0-SNAPSHOT native (powered by Quarkus 1.7.0.Final) started in 0.015s. Listening on:    http://0.0.0.0:8080
2020-09-01 22:25:39,509 INFO  [io.quarkus] (main) Profile prod activated.
2020-09-01 22:25:39,510 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy, resteasy-jackson, smallrye-context-propagation]
Made request to readiness endpoint (0.0.0.0:8080/health/readiness) and received status code of 000
*   Trying 0.0.0.0...
* TCP_NODELAY set
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* connect to     0.0.0.0 port 8080 failed: Connection refused
* Failed to connect to 0.0.0.0 port 8080: Connection refused
* Closing connection 0

Comme mentionné ci-dessus, cela fonctionne localement. Voici la sortie lors de l'exécution locale (en utilisant la même commande)

 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2020-09-01 23:06:31,525 INFO  [io.quarkus] (main) reading-comprehension-server-quarkus-impl 1.0.0-SNAPSHOT native (powered by Quarkus 1.7.0.Final) started in 0.013s. Listening on: http://0.0.0.0:8080
2020-09-01 23:06:31,526 INFO  [io.quarkus] (main) Profile prod activated. 
2020-09-01 23:06:31,526 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy, resteasy-jackson, smallrye-context-propagation]
//tons of debug logs ommitted for brevity, but you can easily recreate them locally
2020-09-01 23:06:32,112 INFO  [com.con.rea.fil.ContainerResponseFilterLoggingImpl] (executor-thread-1) Request received Request method GETRequest headers Accept: */*
Host: 0.0.0.0:8080
User-Agent: curl/7.58.0Request cookies Query parameters Request url http://0.0.0.0:8080//health/readiness with responseResponse body class                                                                  ReadinessHealthResponse {
  isAvailable: true
  availableDependencies: [class DownstreamDependency {
      name: SystemPropertyChecker
      isAvailable: true
   }, class DownstreamDependency {
    name: MemoryChecker
    isAvailable: true
}]
unavailableDependencies: []
}

Response headers Content-Type: application/jsonResponse status code 200

Made request to readiness endpoint (0.0.0.0:8080/health/readiness) and received status code of 200
*   Trying 0.0.0.0...
* TCP_NODELAY set
* Connected to 0.0.0.0 (127.0.0.1) port 8080 (#0)
> GET /health/readiness HTTP/1.1
> Host: 0.0.0.0:8080
> User-Agent: curl/7.58.0
> Accept: */*

Voici mon .gitlab-ci.yml (trouvé à: https://gitlab.com/connorbutch/reading-comprehension/-/blob/5-implement-glue-code/.gitlab-ci.yml)

image: connorbutch/gradle-and-java-11:latest

variables:
  GRADLE_OPTS: "-Dorg.gradle.daemon=false"
  DOCKER_HOST: "tcp://docker:2375"
  DOCKER_DRIVER: "overlay2"

before_script:
  - export GRADLE_USER_HOME=`pwd`/.gradle

#By running this as the same service for all build pods, I hope to save an extra docker build
services:
  - docker:stable-dind

stages:
  - build
  - docker_build
  - acceptance_test

unit_test:
  stage: build
  script: ./gradlew check
  cache:
    key: "$CI_COMMIT_REF_NAME" policy: pull paths: - build - .gradle build: stage: build script: - ./gradlew clean quarkusBuild - ./gradlew clean build -Dquarkus.package.type=native -Dquarkus.native.container-build=true key: "$CI_COMMIT_REF_NAME"
    policy: push
    paths:
      - build
      - .gradle
  artifacts:
    paths:
      - reading-comprehension-server-quarkus-impl/build/

docker_build:
  stage: docker_build
  script:
    - cd reading-comprehension-server-quarkus-impl
    - docker build -f infrastructure/Dockerfile -t registry.gitlab.com/connorbutch/reading-comprehension .
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker push registry.gitlab.com/connorbutch/reading-comprehension acceptance_test: stage: acceptance_test script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker run -i --rm -p 8080:8080 registry.gitlab.com/connorbutch/reading-comprehension & ./wait-for-it-2.sh
    - gradle acceptanceTest

La sortie de docker ps dans le serveur gitlab semble montrer ce que j'attends (donné ci-dessous):

CONTAINER ID        IMAGE                                                          COMMAND                  CREATED             STATUS                  PORTS                    NAMES
d607ecf87991        registry.gitlab.com/connorbutch/reading-comprehension   "./application -Dqua…"   4 seconds ago       Up Less than a second   0.0.0.0:8080->8080/tcp   reading-comprehension

Des extraits pertinents de docker inspect (sur le conteneur s'exécutant sur le serveur gitlab ci) sont donnés ci-dessous:

 "State": {
        "Status": "running",
        "Running": true,
        "Paused": false,
        "Restarting": false,
        "OOMKilled": false,
        "Dead": false,
        "Pid": 207,
        "ExitCode": 0,
        "Error": "",
        "StartedAt": "2020-09-02T00:31:35.621438213Z",
        "FinishedAt": "0001-01-01T00:00:00Z"
    },

  "NetworkMode": "default",
        "PortBindings": {
            "8080/tcp": [
                {
                    "HostIp": "",
                    "HostPort": "8080"
                }
            ]
        },

"NetworkSettings": {
        "Bridge": "",
        "SandboxID": "c18baeec94cb531865994db3184d37949e4c3c34064373ac5d31c49b9eec1d25",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {
            "8080/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "8080"
                }
            ]
        },
        "SandboxKey": "/var/run/docker/netns/c18baeec94cb",
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,
        "EndpointID": "246efed470908aede697bce92f55fb5f58885634eb06ecdbe90686d2beddd41b",
        "Gateway": "172.18.0.1",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "172.18.0.2",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "MacAddress": "02:42:ac:12:00:02",
        "Networks": {
            "bridge": {
                "IPAMConfig": null,
                "Links": null,
                "Aliases": null,
                "NetworkID": "d543b622c078986bab878111bb8bbdfe70f4b60fb384c5a7a175295c13ae9d68",
                "EndpointID": "246efed470908aede697bce92f55fb5f58885634eb06ecdbe90686d2beddd41b",
                "Gateway": "172.18.0.1",
                "IPAddress": "172.18.0.2",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "MacAddress": "02:42:ac:12:00:02",
                "DriverOpts": null
            }
        }
    }

Je soupçonne que le docker du service docker s'exécutant sur le serveur gitlab ci s'exécute sur un autre hôte, ou n'est pas configuré pour gérer le trafic. Quelqu'un a-t-il des idées sur ce qui pourrait en être la cause?

Merci, Connor

Réponses

1 CyrilG. Sep 02 2020 at 07:54

Essayez d'utiliser docker: 8080 pour vous connecter au lieu de localhost. Je ne suis pas tout à fait sûr mais je pense que j'ai eu ce problème avec Dind. Dans cette situation, votre service n'est pas exposé à l'hôte mais au service dind. J'espère que cela résoudra votre problème.