问题描述
在使用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镜像。这些工具提供了更高级的部署功能,并且可以更好地适应复杂的部署需求。
请根据您的具体情况选择适合的解决方案,并根据需要进行调整和优化。