问题描述
在使用Jenkins流水线时,通过运行shell命令来启动链接的容器进行测试。测试完成后,他希望将这些容器推送到注册表(首选AWS ERC,但目前他愿意接受任何有效的示例)。他想知道正确的方法是什么?每个镜像应该放在不同的仓库中吗?如何将由compose文件创建的所有容器推送上去?他尝试使用docker-compose push命令来完成这个任务,但似乎无法正常工作,也找不到任何好的示例。
Jenkinsfile:
node('ec2-build-slave') {
stage('Docker Build') {
/* This builds the actual image; synonymous to
* docker build on the command line */
sh("docker network create aa_backend_network")
sh("docker-compose up -d --build")
//docker.build("$IMAGE")
}
stage ('Docker Push'){
// /* This pushes the previously built image to the Amazon
// * ECS Container Registry */
sh("eval \$(aws ecr get-login --region us-west-2 --no-include-email | sed 's|https://||')")
// docker.withRegistry(ECR_URL, ECR_CRED) {
// docker.image(IMAGE).push()
// }
sh("docker-compose build")
sh("docker-compose push")
}
}catch (exc) {
currentBuild.result = "FAILED"
throw exc
}finally {
// Success or failure, always send notifications
notifyBuild(currentBuild.result)
sh("docker-compose down -v")
sh("docker network prune -f")
}
docker-compose:
version: "2"
services:
db_setup:
networks:
- default
build: .
depends_on:
- db
container_name: db_setup
image: db_setup
command: python asteri_analytics_db.py
working_dir: /asteri_analytics_db/asteri_analytics_db
db:
networks:
- default
- outside
image: mongo:3.6.3
container_name: mongo_db
restart: always
environment:
MONGO_DATA_DIR: /data/db
MONGO_LOG_DIR: /dev/null
MONGO_INITDB_ROOT_USERNAME: ###edited####
MONGO_INITDB_ROOT_PASSWORD: ###edited####
ports:
- 27017:27017
networks:
outside:
external:
name: aa_backend_network
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案
要将使用docker-compose构建的所有镜像推送到注册表,可以使用docker-compose push
命令。确保您已经登录并获得推送到注册表的授权。
以下是推送所有镜像的步骤:
1. 在Jenkinsfile中,确保已经创建了网络并启动了容器。使用docker network create
命令创建网络,并使用docker-compose up -d --build
命令启动容器。
2. 在Docker Compose文件中,定义了两个服务 db_setup
和 db
。db_setup
服务是您要推送的镜像,db
服务是其依赖的镜像。
3. 在Jenkinsfile的Docker Push
阶段中,使用docker-compose build
命令构建所有镜像。
4. 使用docker-compose push
命令将所有镜像推送到注册表。
请确保您已经登录到注册表,并具有推送镜像的权限。
以上是使用docker-compose将多个容器推送到注册表的解决方案。根据您的需求,您可以将每个镜像推送到不同的仓库,只需在Docker Compose文件中为每个服务指定不同的镜像名称即可。
希望对您有所帮助!