Docker-in-Docker 与 Gitlab 共享运行器,用于构建和推送 docker 镜像到注册表
Posted
技术标签:
【中文标题】Docker-in-Docker 与 Gitlab 共享运行器,用于构建和推送 docker 镜像到注册表【英文标题】:Docker-in-Docker with Gitlab Shared runner for building and pushing docker images to registry 【发布时间】:2017-01-29 05:49:21 【问题描述】:一直在尝试设置可以构建 docker 映像的 Gitlab CI,结果发现 DinD 最初仅针对单独的跑步者启用,Blog Post 建议它将很快为共享跑步者启用,
运行 DinD 需要在运行器中启用特权模式,该模式在注册运行器时设置为标志,但找不到共享运行器的等效机制
【问题讨论】:
【参考方案1】:共享运行器现在能够构建 Docker 映像。这是您可以使用的工作:
stages:
- build
- test
- deploy
# ...
# other jobs here
# ...
docker:image:
stage: deploy
image: docker:1.11
services:
- docker:dind
script:
- docker version
- docker build -t $CI_REGISTRY_IMAGE:latest .
# push only for tags
- "[[ -z $CI_BUILD_TAG ]] && exit 0"
- docker tag $CI_REGISTRY_IMAGE:latest $CI_REGISTRY_IMAGE:$CI_BUILD_TAG
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
- docker push $CI_REGISTRY_IMAGE:$CI_BUILD_TAG
此作业假设您使用的是 Gitlab 提供的 Container Registry。只有在构建提交带有版本号标记时,它才会推送图像。
Predefined variables 的文档。
请注意,您需要缓存或生成未在存储库中提交的服务的任何依赖项的临时工件。这应该在其他工作中完成。例如node_modules
通常不包含在存储库中,必须从 build
/test
阶段缓存。
【讨论】:
“共享运行器现在能够构建 Docker 镜像”——我假设您是指 GitLab.com 上的运行器?您如何为 Docker Build 设置安全的共享 GitLab Runner 设置?另见gitlab.com/gitlab-org/gitlab-ce/issues/31379 我还必须使用这样的配置将DOCKER_HOST
作业变量设置为 tcp://docker:2375
。其他的东西都很完美!
更正:如果您使用除 docker
以外的图像作为作业本身(job.image
而不是 job.services.<docker>.image
)并且该图像使用 Docker 服务(我的案例是 Java Docker API 试图与 Docker 交谈)然后您必须使用这样的配置将 DOCKER_HOST
作业变量设置为 tcp://docker:2375
,因为该值实际上是为您设置在 non-dind docker
图像中的。
services: - docker:dind
部分帮我解决了Cannot connect to the Docker daemon
这里需要使用TLS吗?文档docs.gitlab.com/ee/ci/docker/… 表明当我们不控制运行器配置时,TLS 可能会被禁用。因此使用启用 TLS 的版本或不启用 TLS 的版本有意义吗?以上是关于Docker-in-Docker 与 Gitlab 共享运行器,用于构建和推送 docker 镜像到注册表的主要内容,如果未能解决你的问题,请参考以下文章
从 GitLab CI 运行器连接到 docker-in-docker
docker-in-docker (dind) 服务在 gitlab ci 中的作用
gitlab-ci docker-in-docker 访问不安全的注册表
无法在GitLab CI docker-in-docker中对neo4j数据库运行测试
使用 Gitlab CI docker-in-docker 时如何修复 docker 容器中的“sh: tsc not found”错误