Gitlab docker run 无法挂载 ${CI_PROJECT_DIR} 文件夹

Fre*_*aus 6 gitlab docker gitlab-ci

构建容器可以通过绑定安装访问 docker 套接字。在管道中,以下内容将不起作用(导致空/project目录):

    - docker run
      --volume ${CI_PROJECT_DIR}:/project
      image-name
Run Code Online (Sandbox Code Playgroud)

相反,我必须找到构建容器的容器名称并将其卷附加到我的新容器:

    - |
      docker_ps_output=$(docker ps --format "{{.Names}}" --filter "label=com.gitlab.gitlab-runner.job.id=${CI_JOB_ID}")
      readarray -t gitlab_container_names <<<"$docker_ps_output"

      for container_name in "${gitlab_container_names[@]}"
      do
        if [[ $container_name == *"build"* ]]; then
          echo "Found build container $container_name"
          export BUILD_CONTAINER_NAME=$container_name
          break
        else
          echo "Ignoring ${container_name}. We are looking for the build container".
        fi
      done

      if [ -z $BUILD_CONTAINER_NAME ]; then
        echo "Could not find build container name"
        exit 1
      fi
    - docker run
      --volume-from=$BUILD_CONTAINER_NAME
      image-name
Run Code Online (Sandbox Code Playgroud)

这是我的问题、Docker 的限制(容器无法将其卷之一安装到新容器上)还是 Gitlab 的问题?

Ere*_*rez 2

一、定义:

  • 主机 - GitLab Runner 机器。当创建一个新作业时,这台机器本身会创建一个新容器,并且该作业正在其中运行。
  • 作业的容器 - 在主机中启动且作业的script命令在其中运行的容器。

您看到的行为正是我们期望看到的。这是因为,正如您所说,主机的 docker 套接字已安装到作业的容器中。
当您执行docker run作业时,新容器是在主机(GitLab Runner 计算机)内创建的,而不是在作业的容器内创建的。所以现在作业的容器和新容器都是主机中的容器。

这意味着命令中的实际上是将宿主机的--volume ${CI_PROJECT_DIR}:/project文件夹挂载到新容器中的文件夹中。由于主机中不存在此类文件夹。新容器中的文件夹将为空。运行期间将在其中创建的每个文件都将位于主机的文件夹中,而不是作业容器的文件夹中。${CI_PROJECT_DIR}/project/project${CI_PROJECT_DIR}${CI_PROJECT_DIR}

您的解决方案是有效的。我自己用过。

更好的方法是避免docker run在工作中使用。相反,您可以使用图像image-name作为作业的图像(image:关键字)。这更好,但并不总是可行。

如果您可以控制运行器,另一个解决方案是将文件夹从运行器安装到作业的容器。这是在 Runner 的 toml 配置中完成的。您还可以将作业的基本文件夹(/builds我认为通常是)从主机安装到作业的容器。然后,你原来的命令

    - docker run
      --volume ${CI_PROJECT_DIR}:/project
      image-name
Run Code Online (Sandbox Code Playgroud)

也会起作用。