Docker API 响应状态代码冲突,容器 xxxxxx 未运行

问题描述 投票:0回答:1

使用包 testcontainer 在 gitlab CICD 管道内运行 dotnet test 时,容器已启动,但出现此错误:

Error Message:
   Docker.DotNet.DockerApiException : Docker API responded with status code=Conflict, response={"message":"Container 3371da42d9447805eb7d5d7ef2da7b5c8395b5c333e181d4add422205256e49a is not running"}

我在管道中使用 docker 套接字绑定而不是 docker dind,因为文档使用 docker dind 我现在想知道它是否也应该与 docker 套接字绑定一起使用。

gitlab ci 文档中的 docker

我现在想如果 testcontainer 使用 gitlab runner docker,它们应该并行安装,并且可能无法从作业容器内部访问。

.net docker gitlab-ci gitlab-ci-runner testcontainers
1个回答
0
投票

当您使用 docker:dind 服务运行 GitLab 管道时,每个作业都会获得自己的、独立的 docker 实例,可以在其中进行构建,如果有,则在其中创建自己的私有容器。

绑定安装

/var/run/docker.sock
意味着所有gitlab作业,特别是如果您有多个运行程序或并发> 1,在主机上共享相同的docker环境,如果它们尝试创建命名对象,它们很容易发生冲突。明显的优点是它们共享构建缓存,因此这种方法可能会产生更好的构建时间。

如果您可以保证只有一个运行程序并且并发度为 1,那么应该安全地执行

docker container prune -f
作为清理先前作业运行中留下的任何延迟容器的
before_script
步骤。

但是,在这种情况下,即使您的其他作业使用共享套接字,对于 testcontainers 作业来说,显式使用 docker:dind 作为服务似乎可能会更好。要么在 config.toml 中声明两个运行器,一个用于执行“docker”标记,另一个用于执行“docker:dind”标记,并根据需要进行设置。或者只需像平常一样设置一个运行器并启用特权模式,然后为每个需要它的作业声明一个 docker:dind 服务。

© www.soinside.com 2019 - 2024. All rights reserved.