如何通过 Jenkins 构建作业在 Linux 部署服务器上部署 docker-compose 文件?

How to deploy docker-compose file on Linux deployment server from Jenkins build job?

我的 Jenkins 构建作业编译代码,然后创建两个 Docker 图像(每个都是应用程序的一个单独部分)并发布它们。

然后是将它们部署到本地 Linux 服务器的时候了。我有一个 docker-compose.yaml 文件,应该可以启动所有内容和 运行.

我的问题是,我正在寻找一种方法来做三件事:

  1. 我需要将撰写文件放在不受 Jenkins 控制的部署服务器 中,可能允许一些守护进程处理它,因为 Docker图片已上传到 Docker 存储库。我有部署服务器的 root 访问权限,ssh 凭据在 Jenkins 中,我可以在部署服务器上安装东西。 因此,我尝试使用特殊服务用户通过 scp 来做到这一点,但它没有创建目录的权限(例如:/app)——我尝试通过将该用户添加到根组( usermod -aG root username) - 仍然是同样的错误。
  2. 编写文件后,我假设我将能够使用守护程序标志进行部署(因为同一用户也在 docker 组中),但是应用程序已经 运行,我只想部署一个更新(本质上是拉取更新版本的图像),以及如何确保 docker 始终保持已部署的堆栈始终 运行,即使发生崩溃?
  3. 如果 运行 容器持续崩溃,如何避免无限循环,并在它已经尝试重启 5 次时得到通知?

我会复制一个脚本,以便在新图像可用时停止和启动容器:

  1. Scp 应该像 中描述的那样工作。
  2. 您应该复制一个停止(docker-compose down)和启动容器(docker-compose up -d)的脚本以及 docker-compose 文件。然后守护进程必须执行脚本。 编辑:似乎可以使用 docker stack deploy -c /path/to/docker-compose.yml stack_name --with-registry-auth 而无需每次都 stop/start!
  3. 您可以使用 curl 检查服务是否 运行(作为健康检查)。如果其中一项服务不可用,请重试多次并返回错误,如 here:

    所述
      #!/bin/bash
      url='http://website-to-test'
      attempts=5
      timeout=5
      online=false
    
      echo "Checking status of $url."
    
      for (( i=1; i<=$attempts; i++ ))
      do
          code=`curl -sL --connect-timeout 20 --max-time 30 -w "%{http_code}\n" "$url" -o /dev/null`
    
          echo "Found code $code for $url."
    
          if [ "$code" = "200" ]; then
              echo "Website $url is online."
              online=true
              break
         else
              echo "Website $url seems to be offline. Waiting $timeout seconds."
              sleep $timeout
         fi
     done
    
     if $online; then
       echo "Monitor finished, website is online."
       exit 0
     else
       echo "Monitor failed, website seems to be down."
       exit 1
     fi
    

更新:根据您的限制修改响应