gpt4 book ai didi

docker - 如何保留 Jenkins 制作的本地 docker 镜像?

转载 作者:行者123 更新时间:2023-12-02 19:01:49 25 4
gpt4 key购买 nike

使用 docker-pipeline 的 Jenkins 正在下载我的 git 存储库并进行安装。

pipeline {
agent {
docker {
image 'node:6-alpine'
args '-p 8989:8989'
}
}
stages {
stage("install") {
steps {
sh 'npm install -production'
}
}
}
}

但随后它正在清理和删除图像:

$ docker stop --time=1 4b3220d100fae5d903db600992e91fb1ac391f1226b2aee01c6a92c3f0ff009c $ docker rm -f 4b3220d100fae5d903db600992e91fb1ac391f1226b2aee01c6a92c3f0ff009c



所有许多在线部署示例都用于发布到注册表。

我该如何阻止它被清理?

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

最佳答案

您可能想使用 dockerfile代理而不是 docker一。它使用作为项目一部分的 Dockerfile 来构建本地 docker 镜像。所有图像层都将被缓存,因此下次运行构建时,它不会花时间重新构建图像。放置 npm install -production 之类的命令也很有用。在 Dockerfile 中,因此这些依赖项只下载和安装一次。

看看下面的例子。

Dockerfile:

FROM node:6-alpine

RUN npm install -production

Jenkins 文件:

pipeline {
agent {
dockerfile {
filename "Dockerfile"
args '-p 8989:8989'
additionalBuildArgs "-t my-custom-node:latest"
}
}

stages {
stage("Test") {
steps {
sh "npm --version" // this command gets executed inside the container
}
}
}
}

输出:
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 images在我的主机上,我可以看到这张图片:
$ 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 镜像过于消耗,您可以考虑在单独的管道中构建此镜像并将其推送到某个私有(private)存储库。但是因为 docker 缓存了所有的层,所以在这个阶段我不会考虑远程 docker 存储库。使用本地 Dockerfile,尝试构建环境,然后查看发布 docker 镜像是否对您有任何改进。

顺便说一句,Jenkins Pipeline 在终止 Jenkins 作业时终止了 docker 容器。您当前的工作区已挂载,并且容器工作区设置为当前的 Jenkins 作业之一,因此在容器内的工作区中创建的任何文件都将被保留。

要了解有关 Jenkins 流水线代理的更多信息,请转到此处 - https://jenkins.io/doc/book/pipeline/syntax/#agent

关于docker - 如何保留 Jenkins 制作的本地 docker 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58882548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com