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

Posted

技术标签:

【中文标题】使用 ssh 从 Gitlab CI 在远程主机上运行 docker-compose【英文标题】:Run docker-compose up on remote host from Gitlab CI using ssh 【发布时间】:2019-05-09 08:44:35 【问题描述】:

在我的 docker-compose.yml 中,我使用了一些 .env 变量。就这样:

services:
  ms:
    image: 'template:latest'
    build:
      context: .
    restart: always
    ports:
      - '$PORT:$PORT'
    env_file:
      - .env

Docker 文档说,当 .env 和 docker-compose.yml 文件同时存在时,我必须从目录运行 docker-compose up 命令。

我想使用 GitLab CI 自动部署我的服务。这是 .gitlab-ci.yml 文件的一部分:

image: docker:latest

services:
  - docker:dind

...

run-deploy-prod:
  stage: deploy
  cache: 
  before_script:
  # ssh configuration for alpine linux
  script:
    # move docker-compose.yml and .env to the location ~/docker_app/app
    - ssh $USER_NAME@$HOST_ADDRESS 'docker-compose -f '~/docker_app/app/docker-compose.yml' up --no-build -d'

问题: 如何准确地从 ~/docker_app/app 位置运行 docker-compose 以正确加载 .env 变量?

我尝试将 ssh 与 -T-tt-t 选项一起使用,例如:

ssh -T bob@foo "cd ~/docker_app/app && exec \$SHELL && docker-compose up..."

没有任何成功。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我很确定 … && exec \$SHELL && … 不能工作(例如,请参阅 exec builtin 上的官方文档)。

不过,在修正引号之后,您的第一次尝试似乎应该没问题:您可以尝试以下方法吗?

- (…)
- ssh $USER_NAME@$HOST_ADDRESS "docker-compose -f ~/docker_app/app/docker-compose.yml up --no-build -d"

或等效:

- (…)
- ssh $USER_NAME@$HOST_ADDRESS "cd ~/docker_app/app/ && docker-compose up --no-build -d"

要不然,能不能把你得到的错误日志贴一下?

(另外,您应该确保 docker-compose.yml.env 文件已复制到您的 remote 服务器的 $HOST_ADDRESS 的相应文件夹中。 - 这很明显,但我不确定您是否使用过scprsync,因为您在问题“移动 docker-compose.yml 和 .env ...”中给出了相关评论)

【讨论】:

事实证明,对于 GitLab CI,在 ~/ 以外的其他目录中运行 docker-compose 的正确语法是: ssh $USER_NAME@$HOST_ADDRESS 'cd '~/$REMOTE_DIR_NAME_PREFIX/$REMOTE_DIR_NAME/ ' >& /dev/null && docker-compose -f 'docker-compose.yml' up --no-build -d' 如果你在没有 >& /dev/null 的情况下运行 cd 命令,Runner 将简单地冻结,它会没有反应。【参考方案2】:

对于遇到 Gitlab Runner 和 SSH 超时的任何人,这是帮助我意识到并解决问题的唯一线程。正如stashco 评论的那样,对于您的cd 命令,您必须像这样使用它:

cd /path/to/docker-compose &> /dev/null

没有这个&> /dev/null,跑步者每次都会失速。希望这有助于搜索 Gitlab Runner 超时的人,就像我在这里被难住一样:How to fix SSH Webpack build timeout on CI/CD (Gitlab)。

【讨论】:

以上是关于使用 ssh 从 Gitlab CI 在远程主机上运行 docker-compose的主要内容,如果未能解决你的问题,请参考以下文章

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

如何利用Gitlab-ci持续部署到远程机器?

Gitlab CI/Docker:ssh-add 不断要求输入密码

在 Gitlab CI 构建中,我无法通过私钥 ssh 进入 AWS EC2

Gitlab-ci alpine图像:主机密钥验证失败

通过gitlab-runner使用ansible对远程主机执行docker操作