在 gitlab ci 中使用 ssh docker-compose 到远程主机失败

Posted

技术标签:

【中文标题】在 gitlab ci 中使用 ssh docker-compose 到远程主机失败【英文标题】:docker-compose to a remote host using ssh fails in gitlab ci 【发布时间】:2021-05-04 00:01:39 【问题描述】:

我无法使用来自 gitlab CI/CD 管道运行器的 SSH 在远程主机上成功 docker-compose。

docker-compose 失败并出现以下错误:

http.client.RemoteDisconnected: Remote end closed connection without response
urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

我无法在 Gitlab 之外重现该问题。意思是,我尝试在本地机器上运行我的 gitlab 部署步骤使用的相同 docker 映像,在我的脚本中手动执行完全相同的命令,它就像一个魅力......

我什至通过连接到主机并打印 docker version 来尝试脚本中的 ssh 配置,并且成功成功。

deploy_to_staging.sh

#!/bin/bash

apk update
apk add openssh-client
apk add --update bash

eval $(ssh-agent -s)
mkdir -p ~/.ssh
chmod 600 ~/.ssh
# copy the server private key
echo "$SSH_PRIVATE_KEY"
echo "$SSH_PRIVATE_KEY" | ssh-add -
# copy server host key .pub file from /etc/ssh/ and paste it into this variable
echo "$SSH_SERVER_HOSTKEYS"
ssh-keyscan -p 12345 11.222.3.444
ssh-keyscan -p 12345 11.222.3.444 >> ~/.ssh/known_hosts

ssh root@11.222.3.444 -p 12345 "docker version; exit"

# Docker-compose app and db
docker-compose --verbose -H "ssh://root@11.222.3.444:12345" -f docker-compose.staging.yml up -d --build

exit

gitlab-ci.yml

image: alpine:latest

services:
  - docker:dind

stages:
  - build
  - package
  - deploy

[...]

deploy:
  image: docker/compose:alpine-1.28.2
  stage: deploy
  environment:
    name: staging
  only:
    - master
  script:
    - sh deploy_to_staging.sh

感谢您的帮助

【问题讨论】:

您找出问题所在了吗?我有类似的问题.. @kodlan 不幸的是没有。我无法在 Gitlab 之外重现这个问题,所以我被困住了...... 【参考方案1】:

我遇到了这个确切的问题,具体取决于您的配置,它可能有效或无效。基本上,我在我的服务器上创建了一个用户 deployer 我试图通过 ssh 访问。

由于我忘记将此新用户 (deployer) 添加到 docker 用户组,因此他没有 docker 权限。所以基本上我所做的就是

[root@myserver ~]# groupadd docker
groupadd: group 'docker' already exists
[root@myserver ~]# usermod -aG docker deployer

【讨论】:

以上是关于在 gitlab ci 中使用 ssh docker-compose 到远程主机失败的主要内容,如果未能解决你的问题,请参考以下文章

在 gitlab ci 中使用 ssh docker-compose 到远程主机失败

如何在 gitlab-ci.yml 文件中通过 ssh 设置变量值

使用 ssh 从 Gitlab CI 在远程主机上运行 docker-compose

尝试使用 Gitlab CI 创建 SSH 连接,错误:SSH Permission denied (publickey,password)

我需要通过 gitlab-ci 中的 ssh 将 env 变量传递给 docker

GitLab Runner CI 管道内的 SSH 连接无法验证主机密钥