所以,我有以下管道
pipeline {
agent any
environment {
UPLOADED_FILES_DIR='/tmp/spring_fileupload_dir'
DOCKER_USR=credentials('docker_usr')
DOCKER_PASSWD=credentials('docker_passwd')
}
stages {
stage('Test') {
steps {
sh 'mvn test'
}
}
stage('Package') {
steps {
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
stage('Build') {
steps {
sh """
docker build -t azold6/fileupload-pv-pvc:$BUILD_NUMBER .
"""
}
}
stage('Push') {
steps {
sh """
docker login -u="$DOCKER_USR" -p="$DOCKER_PASSWD"
docker push azold6/fileupload-pv-pvc:$BUILD_NUMBER
"""
}
}
stage('Deploy') {
steps {
sshagent(credentials : ['key-to-ec2']) {
sh "docker run -d --name fileupload --rm azold6/fileupload-pv-pvc:$BUILD_NUMBER"
}
}
}
}
}
当我到达“Deploy”部分时,Jenkins显示以下错误:
docker: Error response from daemon: Conflict. The container name "/fileupload" is already in use by container "d7c3ee093de7a06c90e71db1bfc85df849ee218da3ae0cf59aa0bd733d9501e2". You have to remove (or rename) that container to be able to reuse that name.
问题是,容器“fileupload”正在Jenkins容器**中运行,而不是在目标EC2示例上运行。Jenkins引用了错误的机器,即使我使用的是SSH代理插件。
有什么办法解决吗?
1条答案
按热度按时间n6lpvg4x1#
我认为你混淆了两个不同插件的功能。
SSH Agent Plugin允许您通过Jenkins中的ssh-agent为构建提供SSH凭据,实际上是使用通用的withCredentials步骤将SSH私钥绑定到临时文件,然后将其传递给需要它的命令(例如,使用ssh或scp的-i选项)的缩写形式。
因此,这一步像其他插件一样在本地代理(节点)上执行shell命令。
实际上,您需要在远程计算机上运行shell命令,并使用提供的ssh凭据连接到该计算机。
要实现这一点,您需要使用SSH Pipeline Steps(Official Site),这是Jenkins管道步骤,提供SSH工具,例如命令执行或向远程主机传输文件。
用法示例: