Shell 在所有容器都准备好发送到远程服务器后,如何部署docker compose生成的容器内容?

Shell 在所有容器都准备好发送到远程服务器后,如何部署docker compose生成的容器内容?,shell,docker,jenkins,docker-compose,continuous-integration,Shell,Docker,Jenkins,Docker Compose,Continuous Integration,我有一个很好的码头工人为我当地的环境工作和玩耍。docker compose将添加我的网站、mysql和其他一些东西,以使一切正常工作 所有必要的文件现在都在我的docker容器中,我可以 docker cp container_name:/var/www/html/. dist/ 将我的文件放在本地计算机的dist目录中,在那里我可以将文件传输到我的服务器 下一步是自动化整个过程,我想用詹金斯 这不是我第一次使用詹金斯,但由于某种原因,我无法让它工作 我将我的项目从SCM签出到Jenkins

我有一个很好的码头工人为我当地的环境工作和玩耍。docker compose将添加我的网站、mysql和其他一些东西,以使一切正常工作

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

docker cp container_name:/var/www/html/. dist/
将我的文件放在本地计算机的dist目录中,在那里我可以将文件传输到我的服务器

下一步是自动化整个过程,我想用詹金斯

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

我将我的项目从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'
执行build命令后,确定构建过程中的一个点,我确信custom 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%构建。

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

在“管道-->配置”下,选择管道脚本或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()
                }
            }
        }
    }
  }
}

mybe您在sed中的正则表达式是错误的,您可以从日志中复制孔线吗?当我通过cli连接到jenkins服务器时,sed过程正常工作。事实上,我忘了提及这是否是归档我想要做的事情的正确方法。您可以在docker compose中使用healthchecks和“dependens”,让docker自动配置等待时间。我还在容器中使用init脚本来检查所需的远程服务,比如在完成自己的启动之前检查postgres实例。作为补充,我们让jenkins从私有repo中检查映像,并使用groovy管道在本地构建它们。这已经证明对我们来说非常强大。嗨@Dov Rine,我做健康检查,并且依赖于yml文件中的内容。问题是docker compose永远不会结束于它自己,因为它结束于一个侦听localhost的apache服务器。就你而言,你所说的“本地构建”是什么意思?在詹金斯里面?或者在哪里?您是如何配置groovy管道的?我非常感兴趣!