将内部docker的构建工件复制到主机



这是我的jenkinsfile:

pipeline {
agent any 
stages {
stage('Build') { 
steps {
echo '####################################################
echo 'Building Docker container'
echo '####################################################
script {
sh 'docker build -t my-gcc:1.0 .'
}
}
}
stage('Run') { 
steps {
echo '##########################################################
echo 'Running Docker Image'
echo '##########################################################
script {
sh 'docker run  --privileged -i my-gcc:1.0'
sh 'docker cp my-gcc:1.0:/usr/src/myCppProject/build/*.hex .'
}
}
}
stage('Program') { 
steps {
echo '#######################################################
echo 'Programming target '
echo '#######################################################
script {
sh 'openocd -d0 -f board/st_nucleo_f4.cfg -c "init;targets;halt;flash write_image erase Testbench.hex;shutdown"'
}
}
}
}
}

构建并运行docker镜像,之后我想将容器中的十六进制文件提取到jenkins工作目录中,这样我就可以将其闪存到板上。但是当我试图复制文件时,我会得到这个错误:

+ docker cp my-gcc:1.0:1.0:/usr/src/myCppProject/build/*.hex .
Error: No such container:path: my-gcc:1.0:1.0:/usr/src/myCppProject/build/*.hex

我试图访问容器中的其他文件夹并复制内容,但总是出现相同的错误。这样看来,我无法访问容器中的任何文件夹或文件。

我做错了什么?

问候Martin

Jenkins对Docker有一些标准支持;这在Jenkins文档中的Using Docker with Pipeline中有描述。特别是,Jenkins知道如何使用只包含工具的Docker映像,并结合项目的工作区目录。我会使用这种支持,而不是尝试编写docker cp的脚本。

这看起来大概是这样的:

pipeline {
agent none
stages {
stage('Build') {
// Jenkins will run `docker build` for you
agent { dockerfile { args '--privileged' } }
steps {
// The current working directory is bind-mounted into the container;
// the image's `ENTRYPOINT`/`CMD` is ignored.
// Copy the file out of the container:
sh "cp /usr/src/myCppProject/build/*.hex ."
}
}
stage('Program') {
agent any // so not in Docker
steps {
sh 'openocd -d0 -f board/st_nucleo_f4.cfg -c "init;targets;halt;flash write_image erase Testbench.hex;shutdown"'
}
}
}
}

如果使用这种方法,还需要考虑是否应该通过Jenkins管道步骤、运行shell脚本的sh调用、Makefile来运行主构建序列,或者Dockerfile是否真的正确。使用自定义编译器构建Docker镜像可能是有意义的,但随后使用Jenkins管道支持为目标板构建镜像,而不是尝试在Dockerfile中完成所有操作。

在您显示的调用中,您不能直接从映像中docker cp一个文件。启动容器时,使用docker run --name为其命名,然后使用该容器名称中的docker cp

sh 'docker run --name builder ... my-gcc:1.0'
sh 'docker cp builder:/usr/src/myCppProject/build/*.hex .'
sh 'docker rm builder'

最新更新