Докер GitLab CI в докере не может создать том

Я использую Docker в Docker для размещения своих контейнеров, когда они работают через конвейер. Контейнер, который я создаю из своего кода, настроен на передачу тома в ключ gcloud. Это прекрасно работает на моей локальной машине, но на gitlab-runner это не связывает правильно.

При чтении это происходит потому, что он связывает хост с моим контейнером, а не хост dind с моим контейнером.

Как мне связать каталог внутри dind с моим контейнером?

(Также не обращайте внимания на любые незначительные проблемы с тегами и т. Д., Этот файл CI очень рано в разработке)

GitLab ci ниже

image: docker:latest
services:
  - docker:dind


variables:
  DOCKER_DRIVER: overlay2
  SPRING_PROFILES_ACTIVE: gitlab-ci
  CONTAINER_TEST_IMAGE: registry.gitlab.com/fdsa
  CONTAINER_RELEASE_IMAGE: registry.gitlab.com/asdf

stages:
  - build_test_image
  - deploy

.docker_login: &docker_login | # This is an anchor
     docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.gitlab.com

build test image:
    stage: build_test_image
    script:
      - *docker_login
      - docker build -t $CONTAINER_TEST_IMAGE .
      - docker push $CONTAINER_TEST_IMAGE

test run:
    stage: deploy
    script:
        - *docker_login
        - mkdir /key
        - echo $GCP_SVC_KEY > /key/application_default_credentials.json
        # BROKEN LINE HERE
        - docker run --rm -v "/key:/.config/gcloud/" $CONTAINER_TEST_IMAGE
    tags:
        - docker

2 ответа

Фон

Ваша проблема в том, что DIND запускает ВСЕ контейнеры на вашем хосте (или движке верхнего уровня Docker), поэтому, когда вы монтируете каталог в свой $CONTAINER_TEST_IMAGE (Docker 2-го уровня) этот образ фактически запускается на вашем хосте через смонтированный сокет, и поэтому контейнер ищет этот каталог на вашем хосте Docker.

У меня была такая же проблема, связанная с монтированием тестов в контейнерах, и я решил ее, связав тома между контейнерами.

Решение

В вашем случае я думаю, что docker cp Команда может решить вашу необходимость скопировать /key/application_default_credentials.json файл в контейнер.

Что-то вроде:

- docker run --name="myContainer" -d $CONTAINER_TEST_IMAGE
- docker cp /key/application_default_credentials.json myContainer::/.config/gcloud/application_default_credentials.json
- docker exec -it myContainer 'run_tests_or_whatever_command'
- docker rm -f myContainer

Другое приведенное решение вполне допустимо, но я хотел бы поделиться своим решением:

Очевидно, dind будет монтировать каталог /build, чтобы подконтейнеры могли "видеть" его содержимое. Таким образом, поместив ключ в "./" это видно по этим контейнерам. я использую $(pwd) потому что Docker Run не принимает ~ или же .

test run:
    stage: deploy
    script:
        - *docker_login
        - mkdir ./key
        - echo $GCP_SVC_KEY > ./key/application_default_credentials.json
        - docker run --rm -v "$(pwd)/key:/.config/gcloud/" $CONTAINER_TEST_IMAGE
    tags:
        - docker
Другие вопросы по тегам