我如何保持Jenkins制作的本地docker形象?

我如何保持Jenkins制作的本地docker形象?,docker,jenkins,jenkins-pipeline,Docker,Jenkins,Jenkins Pipeline,docker pipeline的Jenkins正在下载并安装我的git存储库 pipeline { agent { docker { image 'node:6-alpine' args '-p 8989:8989' } } stages { stage("install") { steps { sh 'npm ins

docker pipeline的Jenkins正在下载并安装我的git存储库

pipeline {
    agent {
        docker {
            image 'node:6-alpine'
            args '-p 8989:8989' 
         }
    }
    stages {
        stage("install") {
            steps {
                sh 'npm install -production'
            }
        }
    }
}
但随后它会清理并删除图像:

$docker停止--time=1 4b3220d100fae5d903db600992e91fb1ac391f1226b2aee01c6a92c3f0ff009c$ 码头工人rm-f 4b3220d100fae5d903db600992e91fb1ac391f1226b2aee01c6a92c3f0ff009c

所有在线部署示例都是用于发布到注册表的

我怎么才能阻止它被清理呢


如何在本地命名和保存图像?

您可能希望使用
dockerfile
代理,而不是
docker
代理。它使用项目中的docker文件来构建本地docker映像。所有图像层都将被缓存,因此下次运行构建时,它不会花费时间重新构建图像。将
npm install-production
等命令放在Dockerfile中也很有用,因此这些依赖项只需下载和安装一次

看看下面的例子

Dockerfile:

来自节点:6-1
运行npm安装-生产
詹金斯档案:

管道{
代理人{
dockerfile{
文件名“Dockerfile”
args'-p 8989:8989'
additionalBuildArgs“-t我的自定义节点:最新”
}
}
舞台{
阶段(“测试”){
台阶{
sh“npm--version”//此命令在容器内执行
}
}
}
}
输出:

Running on Jenkins in /home/wololock/.jenkins/workspace/pipeline-dockerfile
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Declarative: Agent Setup)
[Pipeline] isUnix
[Pipeline] readFile
[Pipeline] sh
+ docker build -t a3f11e979e510758f10ac738e7e4e5c1160db2eb -f Dockerfile .
Sending build context to Docker daemon 2.048 kB

Step 1/2 : FROM node:6-alpine
Trying to pull repository docker.io/library/node ... 
sha256:17258206fc9256633c7100006b1cfdf25b129b6a40b8e5d37c175026482c84e3: Pulling from docker.io/library/node
bdf0201b3a05: Pulling fs layer
e9fa13fdf0f5: Pulling fs layer
ccc877228d8f: Pulling fs layer
ccc877228d8f: Verifying Checksum
ccc877228d8f: Download complete
bdf0201b3a05: Verifying Checksum
bdf0201b3a05: Download complete
bdf0201b3a05: Pull complete
e9fa13fdf0f5: Verifying Checksum
e9fa13fdf0f5: Download complete
e9fa13fdf0f5: Pull complete
ccc877228d8f: Pull complete
Digest: sha256:17258206fc9256633c7100006b1cfdf25b129b6a40b8e5d37c175026482c84e3
Status: Downloaded newer image for docker.io/node:6-alpine
 ---> dfc29bfa7d41
Step 2/2 : RUN npm install -production
 ---> Running in e058ab280807
[91mnpm[0m[91m WARN[0m[91m enoent[0m[91m ENOENT: no such file or directory, open '/package.json'
[0m[91mnpm [0m[91mWARN[0m[91m !invalid#1 No description
[0m[91mnpm[0m[91m [0m[91mWARN[0m[91m !invalid#1 No repository field.
[0m[91mnpm [0m[91mWARN[0m[91m !invalid#1 No README data
[0m[91mnpm [0m[91mWARN[0m[91m !invalid#1 No license field.
[0m ---> d685094800d9
Removing intermediate container e058ab280807
Successfully built d685094800d9
[Pipeline] dockerFingerprintFrom
[Pipeline] }
[Pipeline] // stage
[Pipeline] sh
+ docker inspect -f . a3f11e979e510758f10ac738e7e4e5c1160db2eb
.
[Pipeline] withDockerContainer
Jenkins does not seem to be running inside a container
$ docker run -t -d -u 1000:1000 -w /home/wololock/.jenkins/workspace/pipeline-dockerfile -v /home/wololock/.jenkins/workspace/pipeline-dockerfile:/home/wololock/.jenkins/workspace/pipeline-dockerfile:rw,z -v /home/wololock/.jenkins/workspace/pipeline-dockerfile@tmp:/home/wololock/.jenkins/workspace/pipeline-dockerfile@tmp:rw,z -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** a3f11e979e510758f10ac738e7e4e5c1160db2eb cat
$ docker top 84ca2e4a30487f114de81dbd60e53219a8cfa3959fb5b05d2c908f872bfe790c -eo pid,comm
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] sh
+ npm --version
3.10.10
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
$ docker stop --time=1 84ca2e4a30487f114de81dbd60e53219a8cfa3959fb5b05d2c908f872bfe790c
$ docker rm -f 84ca2e4a30487f114de81dbd60e53219a8cfa3959fb5b05d2c908f872bfe790c
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
在这个例子中,我使用了
additionalBuildArgs
选项来添加额外的标记。现在,当我在主机上执行docker图像时,我可以看到以下图像:

$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED              SIZE
my-custom-node         latest              d685094800d9        About a minute ago   56.1 MB
docker.io/node         6-alpine            dfc29bfa7d41        6 months ago         56.1 MB
这是很好的第一步。如果在某个时候,你会发现构建DOCKER图像太耗费精力,你可以考虑在单独的管道中构建这个图像并将其推送到某个私人存储库。但因为docker缓存所有层,所以在这个阶段我不会考虑远程docker存储库。使用本地Dockerfile,在构建环境中进行实验,然后查看发布docker映像是否对您有任何改进

顺便说一句,Jenkins管道在终止Jenkins作业时终止docker容器。当前工作区已装入,容器工作区设置为当前Jenkine作业,因此在容器内的工作区内创建的任何文件都将被持久化

要了解更多有关Jenkins管道代理的信息,请访问此处-