nor*_*ter 6 docker gitlab-ci gitlab-ci-runner
我在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
Run Code Online (Sandbox Code Playgroud)
背景
您的问题在于DIND在您的主机(或顶级Docker引擎)上运行所有容器,因此当您将目录安装到$CONTAINER_TEST_IMAGE(第二级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
Run Code Online (Sandbox Code Playgroud)
给出的另一个解决方案完全有效,但我想分享我的解决方案:
显然 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1838 次 |
| 最近记录: |