本地Docker环境GitLab CI+Kaniko构建镜像:无法访问容器镜像仓库
环境配置
本地服务器通过Docker Compose部署GitLab Omnibus(参考官方文档),GitLab通过Nginx反向代理容器对外提供服务,绑定域名并配置了有效SSL证书。
搭建了容器镜像仓库(CR)用于存储Docker镜像,CR绑定主机特定端口对外可访问,容器内部监听另一端口,通过端口映射关联主机端口,因此CR不经过Nginx代理。docker-compose.yml配置如下:
... services: gitlab: ... environment: VIRTUAL_HOST: 'global.gitlab.domain' VIRTUAL_PORT: '80' VIRTUAL_NETWORK: 'nginx_proxy_network' ... GITLAB_OMNIBUS_CONFIG: | ... registry_external_url 'https://global.gitlab.domain:registry_host_port' registry_nginx['listen_port'] = registry_container_port ... ... ports: - "registry_host_port:registry_container_port"
该配置原本可正常推送、拉取镜像。
问题出现
配置了CI流水线使用Kaniko构建Docker镜像(参考官方文档),该方案稳定运行一年多,每周更新GitLab和Runner镜像,但近期突然失败,错误信息如下:
$ /kaniko/executor --verbosity=debug --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --destination "${CI_REGISTRY_IMAGE}:latest" --destination "${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}" DEBU[0000] Copying file /builds/group/repo/Dockerfile to /kaniko/Dockerfile error checking push permissions -- make sure you entered the correct tag name, and that you are authenticated correctly, and try again: checking push permission for "global.gitlab.domain:registry_host_port/group/repo:latest": creating push check transport for global.gitlab.domain:registry_host_port failed: Get "global.gitlab.domain:registry_host_port/v2/": dial tcp 172.22.0.3:registry_host_port: connect: connection refused ERROR: Job failed: exit code 1
172.22.0.3是gitlab容器的IP。错误显示Kaniko尝试直接访问GitLab容器IP的registry_host_port,但容器内部监听的是registry_container_port,因此连接被拒绝。
背景与疑问
故障发生在从docker-compose v1迁移至docker-compose v2之后,有以下疑问:
- 为何Kaniko直接访问GitLab容器IP而非通过域名访问CR?
- 该问题是否与docker-compose v1转v2的迁移有关?
- Docker本地DNS行为近期是否有变更?
- 是否有其他用户遇到过此类问题?
额外配置信息
GitLab Runner也是容器部署,与GitLab容器处于同一docker网络(gitlab_intern),其config.toml配置如下:
... [[runners]] name = "docker-01" url = "http://gitlab" id = 0 token = "XYZ" token_obtained_at = 0001-01-01T00:00:00Z token_expires_at = 0001-01-01T00:00:00Z executor = "docker" clone_url = "http://gitlab" [runners.docker] tls_verify = false image = "alpine:latest" privileged = false disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/cache"] network_mode = "gitlab_intern" shm_size = 0
内容的提问来源于stack exchange,提问作者Densen
相关产品推荐
相关产品推荐

