Докер 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