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 的问题?
一、定义:
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)
也会起作用。
| 归档时间: |
|
| 查看次数: |
1404 次 |
| 最近记录: |