Shell 在所有容器都准备好发送到远程服务器后,如何部署docker compose生成的容器内容?
我有一个很好的码头工人为我当地的环境工作和玩耍。docker compose将添加我的网站、mysql和其他一些东西,以使一切正常工作 所有必要的文件现在都在我的docker容器中,我可以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 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管道的?我非常感兴趣!