首页 文章

Docker中的GitLab CI docker无法创建卷

提问于
浏览
3

我在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 回答

  • 5

    Background

    您的问题在于DIND在您的主机(或顶级Docker引擎)上运行所有容器,因此当您将目录安装到 $CONTAINER_TEST_IMAGE (第二级Docker)时,该映像实际上通过已安装的套接字在主机上运行,因此容器正在Docker主机上查找该目录 .

    我在容器中安装测试时遇到了同样的问题,并通过连接容器之间的卷来解决它 .

    Solution

    在您的情况下,我认为 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
    
  • 1

    给出的另一个解决方案是完全有效的,但我想分享我的解决方案:

    显然dind将挂载/ build目录,因此子容器可以"see"其内容 . 因此,通过将密钥放在 "./" 中,可以通过这些容器查看 . 我使用 $(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
    

相关问题