docker 中的 GitLab CI docker 无法创建卷
GitLab CI docker in docker can't create volume
我在 docker 中使用 docker 来托管我的容器,因为它们通过管道工作。我从我的代码创建的容器设置为有一个卷将 gcloud 密钥传递给容器。这在我的本地机器上完美运行,但在 gitlab-runner 上它没有 link 正确。
从阅读来看,这似乎是因为它 link 是我容器的主机,而不是我容器的 dind 主机。
如何link将 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
背景
您的问题在于 DIND 在您的主机(或顶级 Docker 引擎)上运行所有容器,因此当您将目录挂载到 $CONTAINER_TEST_IMAGE
(第 2 级 Docker) 该图像实际上通过安装的套接字在您的主机上运行,因此容器正在您的 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 目录,因此子容器可以 "see" 它的内容。因此,通过将密钥放在 "./"
中,这些容器可以看到它。我使用 $(pwd)
因为 docker 运行 不接受 ~
或 .
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
我在 docker 中使用 docker 来托管我的容器,因为它们通过管道工作。我从我的代码创建的容器设置为有一个卷将 gcloud 密钥传递给容器。这在我的本地机器上完美运行,但在 gitlab-runner 上它没有 link 正确。
从阅读来看,这似乎是因为它 link 是我容器的主机,而不是我容器的 dind 主机。
如何link将 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
背景
您的问题在于 DIND 在您的主机(或顶级 Docker 引擎)上运行所有容器,因此当您将目录挂载到 $CONTAINER_TEST_IMAGE
(第 2 级 Docker) 该图像实际上通过安装的套接字在您的主机上运行,因此容器正在您的 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 目录,因此子容器可以 "see" 它的内容。因此,通过将密钥放在 "./"
中,这些容器可以看到它。我使用 $(pwd)
因为 docker 运行 不接受 ~
或 .
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