【问题标题】:How to deploy the contents of container build by docker-compose after all containers are ready to remote server?在所有容器准备好远程服务器后,如何通过 docker-compose 部署容器构建的内容?
【发布时间】:2019-07-12 09:35:20
【问题描述】:

我有一个工作良好的 docker-compose 可以在我的本地环境中工作和玩耍。 docker compose 将添加我的网站、mysql 和其他一些东西,以使一切正常。

所有必要的文件现在都在我的一个 docker 容器中,我可以

docker cp container_name:/var/www/html/. dist/

将我的文件放在我的本地计算机上的 dist 目录中,我可以在其中将文件传输到我的服务器。

下一步是自动化整个过程,因为我想使用 Jenkins。

这不是我第一次使用 Jenkins,但由于某种原因我无法让它工作。

我将我的项目从 SCM 签出到 Jenkins 中,并且能够运行 docker-compose up --build,但是当我不使用 -d 参数时,它会卡在这个命令行中,因为 docker-compose up -- build 只会以 CTRL+C 终止,因此我使用 -d 参数。

后来我用了

docker cp container_name:/var/www/html/. dist/

将文件移动到我的 Jenkins 目录中,但这里存在下一个问题:由于我使用 -d 参数,所以 docker cp 命令不会等待 docker-compose up --build 完全完成。

所以我尝试使用类似的东西

docker-compose logs -f -t | sed '/^Almost ! Starting web server now$/ q'

在构建命令之后确定构建过程中的一个点,我确信自定义 docker_run.sh 等文件生成的所有文件和安装都已执行。

但它不起作用。要么工作永远不会结束并卡住,要么我的命令没有完全等待 docker-compose 日志中的“几乎!现在正在启动 web 服务器”行,并且将直接复制文件,而 docker_run.sh 没有在其中完成修改容器。

这是我当前项目部署作业中的 jenkins shell 脚本。

# Create a dist directory
mkdir dist

# Build Docker
docker-compose up -d --build

# Wait for the logs to output "Almost ! Starting web server now"
docker-compose logs -f -t | sed '/^Almost ! Starting web server now$/ q'

# Copy files from container to jenkins directory "dist"
docker cp container_name:/var/www/html/. dist/

# Stop the containers, as I dont need them anymore
docker-compose down

# Go into the dist folder
cd dist

# Send files to remote
rsync -aHAXx --numeric-ids -e "some_parameters_here" . ssh_user@ssh_ip:httpdocs

我希望 docker-compose 由 jenkins 启动,jenkins 等待它准备好,然后将文件 cp 到 jenkins 目录,然后发送到远程服务器。

如上所述,实际结果要么是 Jenkins 永无止境的工作,要么是 Jenkins 从 docker 发送文件而 docker 没有 100% 构建。

【问题讨论】:

  • 你在 sed 中的正则表达式是错误的,你能从日志中复制洞线
  • 当我通过 cli 连接到 jenkins 服务器时,SED 进程正常工作。实际上我忘了提到这是否是归档我想做的事情的正确方法..
  • 你可以在你的 docker-compose 中使用健康检查和“依赖”来让 docker 自动配置等待时间。我还在容器本身中使用了初始化脚本来检查所需的远程服务,例如在完成自己的启动之前的 postgres 实例。
  • 顺便说一句,我们让 jenkins 从一个私人仓库中检查图像,并使用一个 groovy 管道在本地构建它们。事实证明,这对我们来说非常强大。
  • 嗨@Dov Rine,我进行健康检查并依赖于 yml 文件中的内容。问题是 docker-compose 永远不会自行结束,因为它以侦听 localhost 的 apache 服务器结束。就您而言,“在本地构建它们”是什么意思?詹金斯内部?还是在哪里?你是如何配置你的 groovy 管道的?我很感兴趣!

标签: shell docker jenkins docker-compose continuous-integration


【解决方案1】:

这是我们基于 groovy 的管道构建步骤之一的摘录,其中敏感位已被替换。这个管道实际上有 14 个容器:

在 pipeline --> configure 下,选择 pipeline script 或 pipeline from scm。

管道.groovy

pipeline {
  environment {
    registry = "fqdn.to.our.private.docker.repo"
  }
  agent any
  stages {
    stage('Cloning Git') {
        steps {
            git(    
                branch: 'develop',
                credentialsId: 'jenkins-user-ssh-key-credentials-id',
                url: 'jenkinsuser@git_repo_server:/path/to/project/repo'
            )
        }
    }
    stage('Building Container1 image') {
      steps{
        script {
          container1Image = docker.build(registry + "/container1_name:tag", "-f path/to/dockerfile/for/this/container/Dockerfile ./docker/build/context/in/the/checked/out/repo/for/this/container")
        }
      }
    }
    stage('Deploy Container1 Image to Docker Repository') {
        steps {
            script {
            docker.withRegistry('https://fqdn.to.our.private.docker.repo', 'jenkins-credentials-to-access-the-docker-repo') {
                    container1Image.push()
                }
            }
        }
    }
    stage('Building Container2 image') {
      steps{
        script {
          container2Image = docker.build(registry + "/container2_name:tag", "-f path/to/dockerfile/for/this/container/Dockerfile ./docker/build/context/in/the/checked/out/repo/for/this/container")
        }
      }
    }
    stage('Deploy Container2 Image to Docker Repository') {
        steps {
            script {
            docker.withRegistry('https://fqdn.to.our.private.docker.repo', 'jenkins-credentials-to-access-the-docker-repo') {
                    container2Image.push()
                }
            }
        }
    }
  }
}

【讨论】:

    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多