GitLab CI: как подключиться к контейнеру docker, запущенному в скрипте .gitlab-ci.yml? - PullRequest
1 голос
/ 20 февраля 2020

Исходное задание

В моей сборке GitLab CI я хочу:

  • Запустить docker контейнер с локальной AmazonDB. Стандартная схема портов: порт 8000 в docker, порт 8000 открыт. Конечно, все работает локально, я могу подключить (curl, awc-cli, Java код для Amazon DB, независимо от того, что вы будете sh).
  • Использовать его для тестов, т.е. подключаться к нему как --endpoint-url http://localhost:8000 (или любой другой сопоставленный IP вместо localhost).

Задача

.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

Критическое точки выполнения (журнал Gitlab-CI) выглядят следующим образом:

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 завершается ошибкой (пробовал все возможные варианты, это только пример):

$ 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

Я пробовал с и без

  services:
    - docker:dind

Пробовал с именами хостов localhost или docker или tcp://localhost, с префиксом http:// или без него, с портами 80, 8000 или 2375. Ничего не работает.

Значение ${DOCKER_HOST} равно unix:///var/run/docker.sock:

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

/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

Вопросы

  • Как решить эту типичную задачу?
  • Это разрешимо с docker run, или требуется сложное docker-compose использование.
  • Есть ли ссылка на рабочий пример?
  • Является ли проблемой то, что в /etc/hosts?

Links

Есть несколько ссылок, которые я гугле. Решения оттуда пока не помогли мне.

1 Ответ

1 голос
/ 21 февраля 2020

На самом деле нет необходимости писать такое сложное решение с руководством docker run / docker stop в разделе -script. Тонкий и простой способ - использовать локальную DynamoDB как service.

. С этим сценарием локальная DynamoDB будет доступна через URL-адрес из alias элемента services, т. Е. dynamodb-local для этого пример:

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

Выполнение aws dynamodb с http://dynamodb-local:8000 URL-адресом конечной точки работает:

  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

Эта опция была найдена в этом отличном ответе. Большое спасибо @ madhead за предоставленную информацию!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...