尝试在容器化的 Jenkins 中将图像推送到 DockerHub
Trying to push image to DockerHub in containerized Jenkins
我正在容器中的 Jenkins 运行 中设置 CI 管道。我使用的是官方 jenkins/jenkins:latest docker 图片,没有任何修改。在 Jenkins 本身,我安装了 docker 插件并在全局工具配置中添加了 docker 安装,在管道工具部分添加了 docker 工具。
我使用以下命令创建了容器:
docker run -d -u root -p 8080:8080 -p 50000:50000 -v /var/run/docker.sock:/var/run/docker.sock -v jenkins_home:/var/jenkins_home jenkins/jenkins:latest
我安装 docker.sock 以在主机上使用 docker 的一部分来构建映像。
这是 Jenkinsfile 的一部分,失败了:
stage('PUSH') {
steps {
script {
dockerImage = docker.build 'mygithub/spring-petclinic:latest'
docker.withRegistry( '', 'dockerHubCreds' ) {
dockerImage.push()
}
}
}
}
形象建立成功。只有当我尝试将图像推送到 DockerHub 时,构建才会失败。它说没有这样的 file/dir 称为 Docker,但上一步字面上打印出 docker 构建命令。
我在下面提供了日志。
+ docker build -t qeqoos/spring-petclinic:latest .
Sending build context to Docker daemon 63.25MB
Step 1/4 : FROM openjdk:8-jre-alpine3.9
---> f7a292bbb70c
Step 2/4 : COPY target/spring-petclinic-2.5.0-SNAPSHOT.jar /usr/bin/spring-petclinic.jar
---> ced11038c9dd
Step 3/4 : EXPOSE 80
---> Running in f222a20aad19
Removing intermediate container f222a20aad19
---> 3cd6a16e7890
Step 4/4 : ENTRYPOINT ["java", "-jar", "/usr/bin/spring-petclinic.jar", "--server.port=80"]
---> Running in 0a392d01e56b
Removing intermediate container 0a392d01e56b
---> 9afe8b544a7b
Successfully built 9afe8b544a7b
Successfully tagged qeqoos/spring-petclinic:latest
[Pipeline] withEnv
[Pipeline] {
[Pipeline] withDockerRegistry
$ docker login -u qeqoos -p ******** https://index.docker.io/v1/
[Pipeline] // withDockerRegistry
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.io.IOException: error=2, No such file or directory
at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:340)
at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:271)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
Caused: java.io.IOException: Cannot run program "docker": error=2, No such file or directory
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
at hudson.Proc$LocalProc.<init>(Proc.java:252)
at hudson.Proc$LocalProc.<init>(Proc.java:221)
at hudson.Launcher$LocalLauncher.launch(Launcher.java:995)
at hudson.Launcher$ProcStarter.start(Launcher.java:507)
at hudson.Launcher$ProcStarter.join(Launcher.java:518)
at org.jenkinsci.plugins.docker.commons.impl.RegistryKeyMaterialFactory.materialize(RegistryKeyMaterialFactory.java:101)
at org.jenkinsci.plugins.docker.workflow.AbstractEndpointStepExecution2.doStart(AbstractEndpointStepExecution2.java:53)
at org.jenkinsci.plugins.workflow.steps.GeneralNonBlockingStepExecution.lambda$run[=12=](GeneralNonBlockingStepExecution.java:77)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
Finished: FAILURE
对于容器中的Jenkins,有没有更好的方法,或者有什么建议如何制作Jenkins 推送镜像?谢谢。
jenkins/jenkins:latest
默认不会有 docker client
二进制文件,你只需要挂载 unix socket
到容器,这肯定是不够的。
输出中的 command
我想只是打印出来:它计划使用的 docker 命令是什么,并不意味着它已经 运行 它。
因此,对于您来说,您需要在 jenkins
容器中安装 docker 客户端:
- 要么使用绑定挂载:
docker run -v `which docker`:/usr/bin/docker ......
- 或者,如果主机的 docker 客户端不适合容器环境,直接从 here 下载预构建的
docker client
,将 docker
二进制文件复制到容器。
我正在容器中的 Jenkins 运行 中设置 CI 管道。我使用的是官方 jenkins/jenkins:latest docker 图片,没有任何修改。在 Jenkins 本身,我安装了 docker 插件并在全局工具配置中添加了 docker 安装,在管道工具部分添加了 docker 工具。
我使用以下命令创建了容器:
docker run -d -u root -p 8080:8080 -p 50000:50000 -v /var/run/docker.sock:/var/run/docker.sock -v jenkins_home:/var/jenkins_home jenkins/jenkins:latest
我安装 docker.sock 以在主机上使用 docker 的一部分来构建映像。 这是 Jenkinsfile 的一部分,失败了:
stage('PUSH') {
steps {
script {
dockerImage = docker.build 'mygithub/spring-petclinic:latest'
docker.withRegistry( '', 'dockerHubCreds' ) {
dockerImage.push()
}
}
}
}
形象建立成功。只有当我尝试将图像推送到 DockerHub 时,构建才会失败。它说没有这样的 file/dir 称为 Docker,但上一步字面上打印出 docker 构建命令。
我在下面提供了日志。
+ docker build -t qeqoos/spring-petclinic:latest .
Sending build context to Docker daemon 63.25MB
Step 1/4 : FROM openjdk:8-jre-alpine3.9
---> f7a292bbb70c
Step 2/4 : COPY target/spring-petclinic-2.5.0-SNAPSHOT.jar /usr/bin/spring-petclinic.jar
---> ced11038c9dd
Step 3/4 : EXPOSE 80
---> Running in f222a20aad19
Removing intermediate container f222a20aad19
---> 3cd6a16e7890
Step 4/4 : ENTRYPOINT ["java", "-jar", "/usr/bin/spring-petclinic.jar", "--server.port=80"]
---> Running in 0a392d01e56b
Removing intermediate container 0a392d01e56b
---> 9afe8b544a7b
Successfully built 9afe8b544a7b
Successfully tagged qeqoos/spring-petclinic:latest
[Pipeline] withEnv
[Pipeline] {
[Pipeline] withDockerRegistry
$ docker login -u qeqoos -p ******** https://index.docker.io/v1/
[Pipeline] // withDockerRegistry
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.io.IOException: error=2, No such file or directory
at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:340)
at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:271)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
Caused: java.io.IOException: Cannot run program "docker": error=2, No such file or directory
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
at hudson.Proc$LocalProc.<init>(Proc.java:252)
at hudson.Proc$LocalProc.<init>(Proc.java:221)
at hudson.Launcher$LocalLauncher.launch(Launcher.java:995)
at hudson.Launcher$ProcStarter.start(Launcher.java:507)
at hudson.Launcher$ProcStarter.join(Launcher.java:518)
at org.jenkinsci.plugins.docker.commons.impl.RegistryKeyMaterialFactory.materialize(RegistryKeyMaterialFactory.java:101)
at org.jenkinsci.plugins.docker.workflow.AbstractEndpointStepExecution2.doStart(AbstractEndpointStepExecution2.java:53)
at org.jenkinsci.plugins.workflow.steps.GeneralNonBlockingStepExecution.lambda$run[=12=](GeneralNonBlockingStepExecution.java:77)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
Finished: FAILURE
对于容器中的Jenkins,有没有更好的方法,或者有什么建议如何制作Jenkins 推送镜像?谢谢。
jenkins/jenkins:latest
默认不会有 docker client
二进制文件,你只需要挂载 unix socket
到容器,这肯定是不够的。
输出中的 command
我想只是打印出来:它计划使用的 docker 命令是什么,并不意味着它已经 运行 它。
因此,对于您来说,您需要在 jenkins
容器中安装 docker 客户端:
- 要么使用绑定挂载:
docker run -v `which docker`:/usr/bin/docker ......
- 或者,如果主机的 docker 客户端不适合容器环境,直接从 here 下载预构建的
docker client
,将docker
二进制文件复制到容器。