我正在寻找一种方法将docker-compose
图像和/或构建部署到远程服务器,特别是但不限于DigitalOcean VPS。
docker-compose
目前正在开展CircleCI持续集成服务,它会自动验证测试是否通过。但是,应该在成功时自动部署。
我的docker-compose.yml
看起来像这样:
version: '2'
services:
web:
image: name/repo:latest
ports:
- "3000:3000"
volumes:
- /app/node_modules
- .:/app
depends_on:
- mongo
- redis
mongo:
image: mongo
command: --smallfiles
volumes:
- ./data/mongodb:/data/db
redis:
image: redis
volumes:
- ./data/redis:/data
docker-compose.override.yml
:
version: '2'
services:
web:
build: .
circle.yml
相关部分:
deployment:
latest:
branch: master
commands:
- docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
- docker push name/repo:$CIRCLE_SHA1
- docker push name/repo:latest
答案 0 :(得分:7)
您的docker-compose
和circle
配置已经看起来非常不错了。
您的docker-compose.yml
已设置为从Docker Hub收集图像,该图像在测试通过后上传。我们将在远程服务器上使用此图像,而不是每次构建图像(这需要很长时间),我们将使用这个已经准备好的图像。
您最好将build: .
分隔为docker-compose.override.yml
文件,priority issues can arise if we use a docker-compose.prod.yml
file。
有多种方法可以完成部署。最受欢迎的可能是 SSH 和Webhooks。
我们将使用SSH。
修改您的circle.yml
配置以执行额外步骤,以加载我们的.scripts/deploy.sh
bash文件:
deployment:
latest:
branch: master
commands:
- docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
- docker push name/repo:$CIRCLE_SHA1
- docker push name/repo:latest
- .scripts/deploy.sh
deploy.sh
将包含一些通过SSH连接到我们的远程服务器的指令,并更新存储库和Docker镜像并重新加载Docker Compose服务。
在执行之前,您应该有一个包含项目文件夹的远程服务器(即git clone https://github.com/zurfyx/my-project
),并且安装了Docker和Docker Compose。
deploy.sh
#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
(
cd "$DIR/.." # Go to project dir.
ssh $SSH_USERNAME@$SSH_HOSTNAME -o StrictHostKeyChecking=no <<-EOF
cd $SSH_PROJECT_FOLDER
git pull
docker-compose pull
docker-compose stop
docker-compose rm -f
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
EOF
)
注意:最后一个EOF没有缩进。这就是bash HEREDOC的工作方式。
deploy.sh步骤说明:
ssh $SSH_USERNAME@$SSH_HOSTNAME
:通过SSH连接远程主机。 -o StrictHostChecking=no
避免SSH询问我们是否信任该服务器。cd $SSH_PROJECT_FOLDER
:浏览项目文件夹(您通过git clone ...
收集的文件夹)git pull
:更新项目文件夹。这对于更新docker-compose / Dockerfile以及依赖于某些源代码文件的任何共享卷非常重要。docker-compose stop
:刚刚下载了我们的远程依赖项。停止当前正在运行的docker-compose服务。docker-compose rm -f
:删除docker-compose服务。这一步非常重要,否则we'll reuse old volumes。docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
。执行以分离模式扩展docker-compose.prod.yml
的{{1}}。在CI上,您需要填写以下环境变量(部署脚本使用):
docker-compose.yml
:您的SSH用户名(即root)$SSH_USERNAME
:您的SSH主机名(即stackoverflow.com)$SSH_HOSTNAME
:存储项目的文件夹(与$SSH_PROJECT_FOLDER
登录的位置相对或绝对。(即my-project /)SSH密码怎么样?在这种情况下,CircleCI提供了一种存储SSH密钥的方法,因此在通过SSH登录时不再需要密码。
否则只需将$SSH_USERNAME
SSH连接编辑为以下内容:
deploy.sh
有关SSH密码here的更多信息。
总之,我们所要做的就是创建一个与远程服务器连接的脚本,让它知道源代码已经更新。好吧,并执行适当的升级步骤。
仅供参考,这与替代Webhooks方法的工作方式类似。
答案 1 :(得分:0)
WatchTower为您解决了这个问题。
https://github.com/v2tec/watchtower
您的CI只需构建映像并推送到注册表。然后,WatchTower每N秒钟轮询一次注册表,并使用最新和最好的映像自动重启服务。只需将以下代码添加到您的撰写yaml中即可:
watchtower:
image: v2tec/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/config.json
command: --interval 30