使用 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
的相应文件夹中。 - 这很明显,但我不确定您是否使用过scp
或rsync
,因为您在问题“移动 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/Docker:ssh-add 不断要求输入密码