GitLab CI中部署到远程Docker主机时的SSL错误

65次阅读
没有评论

问题描述

在使用GitLab CI部署Docker镜像到外部Docker主机时遇到了SSL错误。他使用的是共享的Runner,并且镜像存储在私有的GitLab注册表中。为了构建镜像和运行Docker,他使用了docker in docker。以下是他目前的配置:

services:
- name: docker:dind
  command: ["--experimental"]
stages:
- deploy
variables:
  PHP_IMAGE_REF: ${CI_REGISTRY_IMAGE}/php:${CI_BUILD_REF_NAME}
  PHP_IMAGE_LATEST: ${CI_REGISTRY_IMAGE}/php:latest
  NGINX_IMAGE_REF: ${CI_REGISTRY_IMAGE}/nginx:${CI_BUILD_REF_NAME}
  NGINX_IMAGE_LATEST: ${CI_REGISTRY_IMAGE}/nginx:latest
  LETS_ENCRYPT_MAIL: "security@example.com"
cache:
  paths:
  - api/vendor

不幸的是,上述配置导致了以下错误,并且流水线无法成功执行。当他在本地的Windows机器上运行以下命令时,使用相同的证书,却能够正常工作:

docker-compose --file docker-compose.prod.yml --verbose --host $STAGE_DOCKER_HOST --tlsverify --tlscacert ~/docker/certs/ca.pem --tlscert ~/docker/certs/cert.pem --tlskey ~/docker/certs/key.pem down -v

错误信息如下:

urllib3.connectionpool._new_conn: Starting new HTTPS connection (1): 159.xxx.xxx.xxx
Traceback (most recent call last):
  File "/usr/bin/docker-compose", line 11, in <module>
    sys.exit(main())
  File "/usr/lib/python2.7/site-packages/compose/cli/main.py", line 71, in main
    command()
  File "/usr/lib/python2.7/site-packages/compose/cli/main.py", line 124, in perform_command
    project = project_from_options('.', options)
  File "/usr/lib/python2.7/site-packages/compose/cli/command.py", line 41, in project_from_options
    compatibility=options.get('--compatibility'),
  File "/usr/lib/python2.7/site-packages/compose/cli/command.py", line 121, in get_project
    host=host, environment=environment
  File "/usr/lib/python2.7/site-packages/compose/cli/command.py", line 95, in get_client
    version_info = six.iteritems(client.version())
  File "/usr/lib/python2.7/site-packages/docker/api/daemon.py", line 181, in version
    return self._result(self._get(url), json=True)
  File "/usr/lib/python2.7/site-packages/docker/utils/decorators.py", line 46, in inner
    return f(self, *args, **kwargs)
  File "/usr/lib/python2.7/site-packages/docker/api/client.py", line 198, in _get
    return self.get(url, **self._set_request_timeout(kwargs))
  File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 521, in get
    return self.request('GET', url, **kwargs)
  File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python2.7/site-packages/requests/adapters.py", line 506, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='159.xxx.xxx.xxx', port=2376): Max retries exceeded with url: /v1.30/version (Caused by SSLError(SSLError(0, u'unknown error (_ssl.c:3027)'),))
ERROR: Job failed: exit code 1

用户提出以下问题:
1. 我有哪些选项?
2. 是否有其他/更好的方法来部署Docker镜像到远程Docker主机?
3. 通过使用自己的Runner可以解决问题吗?(已尝试,结果基本相同)

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据错误信息,这个问题可能是由于SSL连接的问题导致的。以下是一些可能的解决方案:
1. 确保目标主机和GitLab共享Runner上的Docker版本相同。您可以在脚本的开头添加docker info命令,检查目标主机的Docker版本。
2. 检查目标主机的TLS配置。可能存在加密套件不匹配的问题。您可以尝试在目标主机上运行以下命令,查看支持的加密套件:
bash
openssl s_client -connect 159.xxx.xxx.xxx:2376

如果目标主机不支持共享Runner上使用的加密套件,您可以尝试更新目标主机的TLS配置。
3. 检查GitLab Runner的配置。确保GitLab Runner的配置文件中的Docker版本与目标主机上的版本匹配。

方案2

如果上述解决方案都无法解决问题,您可以尝试使用其他方法来部署Docker镜像到远程Docker主机。以下是一些可能的方法:
1. 使用SSH连接到远程主机,并使用docker-compose命令手动部署镜像。这样可以绕过GitLab CI的限制,并直接在远程主机上执行部署操作。
2. 使用其他部署工具,如Kubernetes或Ansible,来管理和部署Docker镜像。这些工具提供了更高级的部署功能,并且可以更好地适应复杂的部署需求。
请根据您的具体情况选择适合的解决方案,并根据需要进行调整和优化。

正文完