问题描述
在Jenkins的流水线中运行一个Docker容器,使用Jenkins的docker.withRun()
方法。用户希望在Jenkins的日志中包含Docker容器的标准输出,但目前并没有显示出来。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
你可以在Jenkins的流水线中使用docker.run()
方法来运行Docker容器,并将其设置为交互模式。这样可以将Docker容器的标准输出包含在Jenkins的日志中。
以下是一个示例的Jenkins流水线代码:
pipeline {
agent any
options {
timestamps{}
}
stages {
stage('docker run') {
steps {
script {
def img = 'tmp'
def docker_run_args = '-e STR=foo'
sh "docker run --rm -it ${docker_run_args} ${img}"
}
}
}
}
}
在上面的示例中,我们使用docker.run()
方法来运行Docker容器,并将其设置为交互模式(使用-it
参数)。这样可以将Docker容器的标准输出包含在Jenkins的日志中。
请注意,我们还使用了--rm
参数来在容器完成后删除容器。这样可以确保每次运行流水线时都使用一个新的容器。
方案2
使用
docker.withRun()
方法运行Docker容器时,默认是以后台模式运行的,无法将标准输出包含在Jenkins的日志中。你可以尝试使用docker.run()
方法,并将其设置为交互模式来解决这个问题。
以下是一个示例的Jenkins流水线代码:
pipeline {
agent any
options {
timestamps{}
}
stages {
stage('docker run') {
steps {
script {
def img = 'tmp'
def docker_run_args = '-e STR=foo'
def ms = docker.image(img)
ms.run(docker_run_args)
}
}
}
}
}
在上面的示例中,我们使用docker.run()
方法来运行Docker容器,并将其设置为交互模式(使用-i
参数)。这样可以将Docker容器的标准输出包含在Jenkins的日志中。
请注意,我们没有使用--rm
参数,因此容器将保留在运行后台。如果你希望在每次运行流水线时都使用一个新的容器,请添加--rm
参数。
方案3
如果你只是想查看容器的标准输出,而不需要将其包含在Jenkins的日志中,你可以使用
docker logs
命令来查看容器的标准输出。
以下是一个示例的Jenkins流水线代码:
pipeline {
agent any
options {
timestamps{}
}
stages {
stage('docker run') {
steps {
script {
def img = 'tmp'
def docker_run_args = '-e STR=foo'
sh "docker run --rm ${docker_run_args} ${img}"
}
}
}
}
}
在上面的示例中,我们使用docker run
命令来运行Docker容器,并使用--rm
参数在容器完成后删除容器。然后,我们使用docker logs
命令来查看容器的标准输出。
请注意,这种方法不会将容器的标准输出包含在Jenkins的日志中,而是在Jenkins的控制台输出中显示容器的标准输出。