代码之家  ›  专栏  ›  技术社区  ›  Mr. E

在gitlab runner上共享docker容器内的卷

  •  0
  • Mr. E  · 技术社区  · 5 年前

    因此,我试图在某种程度上以DinD设置方式将包含项目文件的工作目录装载到gitlab runner的子实例中。我希望能够在docker实例中挂载一个卷,这将允许我到处乱搞和测试东西。像e2e测试之类,我不需要编译一个新的容器来注入理想情况下需要的文件,这样我就可以在DinD环境中共享数据,而无需为运行的每个作业构建一个新的容器

    我尝试了以下内容(使用Docker时未装入Docker卷):dind(#41227)·问题·GitLab。org/GitLab FOSS·GitLab)和我正在安装一些目录,但这不是我正在寻找的项目数据。

    所以,在测试作业中,我创建了一个虚拟文件,我希望将目录装载到一个容器中并查看这些文件

    我有一个测试ci-yml,它符合我的要求。我在我要装载的卷中制作测试文件,我希望在目录列表中看到,但遗憾的是没有。在我第二次尝试时,我无法获得容器ID,因为转轮上不存在标签,而且它总是显示为空白。然而,第一阶段显示了希望,因为它在k8s之外的壳转轮上完美工作。但是,只要我把标签改成使用k8s跑步者,它就完了。我可以看到旧的目录文件/web和我正在挂载的目录,但看不到其中的文件。奇怪的

    ci。yml

    image: docker:stable
    services:
      - docker:dind
    
    stages:
      - compile
    
    variables:
      SHARED_PATH: /builds/$CI_PROJECT_PATH/shared/
      DOCKER_DRIVER: overlay2
    
    .test: &test
      stage: compile
      tags:
    - k8s-vols
      script:
      - docker version
      - 'export TESTED_IMAGE=$(echo ${CI_JOB_NAME} | sed "s/test //")'
      - docker pull ${TESTED_IMAGE}
      - 'export SHARED_PATH="$(dirname ${CI_PROJECT_DIR})/shared"'
      - echo ${SHARED_PATH}
      - echo ${CI_PROJECT_DIR}
      - mkdir -p ${SHARED_PATH}
      - touch ${SHARED_PATH}/test_file
      - touch ${CI_PROJECT_DIR}/test_file2
      - find ${SHARED_PATH}
      #- find ${CI_PROJECT_DIR}
      - docker run --rm -v ${CI_PROJECT_DIR}:/mnt ${TESTED_IMAGE} find /mnt
      - docker run --rm -v ${CI_PROJECT_DIR}:/mnt ${TESTED_IMAGE} ls -lR /mnt
      - docker run --rm -v ${SHARED_PATH}:/mnt ${TESTED_IMAGE} find /mnt
      - docker run --rm -v ${SHARED_PATH}:/mnt ${TESTED_IMAGE} ls -lR /mnt
    
    test alpine: *test
    test ubuntu: *test
    test centos: *test
    
    
    testing:
      stage: compile
      tags:
    - k8s-vols
      image:
    name: docker:stable
    entrypoint: ["/bin/sh", "-c"]
      script:
    # get id of container
    - export CONTAINER_ID=$(docker ps -q -f "label=com.gitlab.gitlab-runner.job.id=$CI_JOB_ID" -f "label=com.gitlab.gitlab-runner.type=build")
    # get mount name
    - export MOUNT_NAME=$(docker inspect $CONTAINER_ID -f "{{ range .Mounts }}{{ if eq .Destination \"/builds/${CI_PROJECT_NAMESPACE}\" }}{{ .Source }}{{end}}{{end}}" | cut -d "/" -f 6)
    # run container
    - docker run -v $MOUNT_NAME:/builds -w /builds/$CI_PROJECT_NAME --entrypoint=/bin/sh busybox -c "ls -la"
    

    这是我正在处理的价值观文件

    image: docker-registry.corp.com/base-images/gitlab-runner:alpine-v13.3.1
    imagePullPolicy: IfNotPresent
    gitlabUrl: http://gitlab.corp.com
    runnerRegistrationToken: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    runnerToken: ""
    unregisterRunners: true
    terminationGracePeriodSeconds: 3600
    concurrent: 5
    checkInterval: 10
    rbac:
      create: true
      resources: ["pods", "pods/exec", "secrets"]
      verbs: ["get", "list", "watch","update", "create", "delete"]
      clusterWideAccess: false
    metrics:
      enabled: true
    runners:
      image: docker-registry.corp.com/base-images/docker-dind:v1
      imagePullPolicy: "if-not-present"
      requestConcurrency: 5
      locked: true
      tags: "k8s-vols"
      privileged: true
      secret: gitlab-runner-vols
      namespace: gitlab-runner-k8s-vols
      pollTimeout: 180
      outputLimit: 4096
      kubernetes:
        volumes:
        - type: host_path
          volume:
            name: docker
            host_path: /var/run/docker.sock
            mount_path: /var/run/docker.sock
            read_only: false
      cache: {}
      builds: {}
      services: {}
      helpers:
        cpuLimit: 200m
        memoryLimit: 256Mi
        cpuRequests: 100m
        memoryRequests: 128Mi
        image: docker-registry.corp.com/base-images/gitlab-runner-helper:x86_64-latest
      env:
        NAME: VALUE
        CI_SERVER_URL: http://gitlab.corp.com
        CLONE_URL:
        RUNNER_REQUEST_CONCURRENCY: '1'
        RUNNER_EXECUTOR: kubernetes
        REGISTER_LOCKED: 'true'
        RUNNER_TAG_LIST: k8s-vols
        RUNNER_OUTPUT_LIMIT: '4096'
        KUBERNETES_IMAGE: ubuntu:18.04
        KUBERNETES_PRIVILEGED: 'true'
        KUBERNETES_NAMESPACE: gitlab-runners-k8s-vols
        KUBERNETES_POLL_TIMEOUT: '180'
        KUBERNETES_CPU_LIMIT:
        KUBERNETES_MEMORY_LIMIT:
        KUBERNETES_CPU_REQUEST:
        KUBERNETES_MEMORY_REQUEST:
        KUBERNETES_SERVICE_ACCOUNT:
        KUBERNETES_SERVICE_CPU_LIMIT:
        KUBERNETES_SERVICE_MEMORY_LIMIT:
        KUBERNETES_SERVICE_CPU_REQUEST:
        KUBERNETES_SERVICE_MEMORY_REQUEST:
        KUBERNETES_HELPER_CPU_LIMIT:
        KUBERNETES_HELPER_MEMORY_LIMIT:
        KUBERNETES_HELPER_CPU_REQUEST:
        KUBERNETES_HELPER_MEMORY_REQUEST:
        KUBERNETES_HELPER_IMAGE:
        KUBERNETES_PULL_POLICY:
    securityContext:
      fsGroup: 65533
      runAsUser: 100
    resources: {}
    affinity: {}
    nodeSelector: {}
    tolerations: []
    envVars:
        - name: CI_SERVER_URL
          value: http://gitlab.corp.com
        - name: CLONE_URL
        - name: RUNNER_REQUEST_CONCURRENCY
          value: '1'
        - name: RUNNER_EXECUTOR
          value: kubernetes
        - name: REGISTER_LOCKED
          value: 'true'
        - name: RUNNER_TAG_LIST
          value: k8s-vols
        - name: RUNNER_OUTPUT_LIMIT
          value: '4096'
        - name: KUBERNETES_IMAGE
          value: ubuntu:18.04
        - name: KUBERNETES_PRIVILEGED
          value: 'true'
        - name: KUBERNETES_NAMESPACE
          value: gitlab-runner-k8s-vols
        - name: KUBERNETES_POLL_TIMEOUT
          value: '180'
        - name: KUBERNETES_CPU_LIMIT
        - name: KUBERNETES_MEMORY_LIMIT
        - name: KUBERNETES_CPU_REQUEST
        - name: KUBERNETES_MEMORY_REQUEST
        - name: KUBERNETES_SERVICE_ACCOUNT
        - name: KUBERNETES_SERVICE_CPU_LIMIT
        - name: KUBERNETES_SERVICE_MEMORY_LIMIT
        - name: KUBERNETES_SERVICE_CPU_REQUEST
        - name: KUBERNETES_SERVICE_MEMORY_REQUEST
        - name: KUBERNETES_HELPER_CPU_LIMIT
        - name: KUBERNETES_HELPER_MEMORY_LIMIT
        - name: KUBERNETES_HELPER_CPU_REQUEST
        - name: KUBERNETES_HELPER_MEMORY_REQUEST
        - name: KUBERNETES_HELPER_IMAGE
        - name: KUBERNETES_PULL_POLICY
    hostAliases:
      - ip: "10.10.x.x"
        hostnames:
        - "ch01"
    podAnnotations:
      prometheus.io/path: "/metrics"
      prometheus.io/scrape: "true"
      prometheus.io/port: "9252"
    podLabels: {}
    

    所以,我对掌舵图做了一些调整。我在配置图中添加了一个卷部分

    config.toml: |
    concurrent = {{ .Values.concurrent }}
    check_interval = {{ .Values.checkInterval }}
    log_level = {{ default “info” .Values.logLevel | quote }}
    {{- if .Values.metrics.enabled }}
    listen_address = ‘[::]:9252’
    {{- end }}
    volumes = ["/builds:/builds"]
    #volumes = ["/var/run/docker.sock:/var/run/docker.sock", “/cache”, “/builds:/builds”]
    

    我试着使用最后一行,其中包括docker sock mount,但当它运行时,它抱怨说找不到mount docker。sock,找不到文件,所以我只在本节中使用了builds目录,并在values文件中添加了docker。袜子支架。而且似乎效果不错。除此之外的一切

    我也看到过将跑步者设置为特权的例子,但这似乎对我没有多大帮助

    当我运行管道时,这是输出

    enter image description here

    enter image description here

    所以你看不到任何文件

    感谢您花时间仔细考虑您的请求,这真的很有帮助!

    0 回复  |  直到 4 年前
    推荐文章