docker - Jenkins Pipeline 构建 Dockerfile 但无法在容器内运行步骤
问题描述
我正在构建一个 FreePascal Web 应用程序,并且正在将 Jenkins 管道用于 CI/CD。
我有以下 Dockerfile (不是世界上最有效的东西,但现在还可以):
FROM ubuntu as builder
RUN apt-get update -y
RUN apt-get install -y libcurl4-openssl-dev
RUN apt-get install -y fpc
ARG BUILD_TYPE=prod
ENV BUILD_TYPE=${BUILD_TYPE}
COPY . /var/www/app
WORKDIR /var/www/app
RUN make build
RUN make build-tests
FROM actilis/httpd-cgi
RUN yum -y install postgresql
ENV HTTPD_ENABLE_CGI=true
COPY ./httpd.conf /etc/httpd/conf.d/000-default.conf
COPY --from=builder /var/www/app/public/app.cgi /var/www/app/
COPY --from=builder /var/www/app/bin/unit/TestRunner /var/www/app/
当我sh
进入这个容器并cd
进入/var/www/app
时,我看到./TestRunner
并且app.cgi
;这些分别是我的单元测试和我的 cgi 应用程序可执行文件。我可以跑:
./TestRunner --format=xml --all
并且所有测试都将运行。到目前为止,一切都很好。
问题是当我尝试在 Jenkins 上重新创建相同的设置时。我正在使用以下 Jenkinsfile:
pipeline {
agent none
stages {
stage('Back-end') {
agent {
dockerfile {
filename 'Dockerfile'
dir 'backend'
}
}
steps {
sh './TestRunner --format=xml --all'
}
}
stage('Front-end') {
agent {
docker { image 'node:7-alpine' }
}
steps {
sh 'node --version'
}
}
}
}
在 Jenkins 上,它无法找到该./TestRunner
文件。输出是:
+ docker build -t 181ef0bcb3bf204f1879365a51eb4f056599fcbc -f backend/Dockerfile backend
Sending build context to Docker daemon 1.405MB
Step 1/16 : FROM ubuntu as builder
---> 4c108a37151f
Step 2/16 : RUN apt-get update -y
---> Using cache
---> 23006844dbe3
Step 3/16 : RUN apt-get install -y libcurl4-openssl-dev
---> Using cache
---> 85f33caeb6fa
Step 4/16 : RUN apt-get install -y fpc
---> Using cache
---> 4179833a6dc6
Step 5/16 : ARG BUILD_TYPE=prod
---> Using cache
---> 175016eb89cd
Step 6/16 : ENV BUILD_TYPE=${BUILD_TYPE}
---> Using cache
---> 93f40d4821b4
Step 7/16 : COPY . /var/www/app
---> Using cache
---> ba927c86c8f0
Step 8/16 : WORKDIR /var/www/app
---> Using cache
---> ad053831767b
Step 9/16 : RUN make build
---> Using cache
---> 7cee4fa21f10
Step 10/16 : RUN make build-tests
---> Using cache
---> 1d7db41bc613
Step 11/16 : FROM actilis/httpd-cgi
---> 98b08d011dc9
Step 12/16 : RUN yum -y install postgresql
---> Using cache
---> 2dd8ccfec261
Step 13/16 : ENV HTTPD_ENABLE_CGI=true
---> Using cache
---> 1a78db6d4788
Step 14/16 : COPY ./httpd.conf /etc/httpd/conf.d/000-default.conf
---> Using cache
---> 4147b79edb69
Step 15/16 : COPY --from=builder /var/www/app/public/app.cgi /var/www/app/
---> Using cache
---> 41f28ebd3602
Step 16/16 : COPY --from=builder /var/www/app/bin/unit/TestRunner /var/www/app/
---> Using cache
---> f897e3055e8b
Successfully built f897e3055e8b
Successfully tagged 181ef0bcb3bf204f1879365a51eb4f056599fcbc:latest
[Pipeline] dockerFingerprintFrom
[Pipeline] sh
+ docker inspect -f . 181ef0bcb3bf204f1879365a51eb4f056599fcbc
.
[Pipeline] withDockerContainer
Jenkins does not seem to be running inside a container
$ docker run -t -d -u 111:115 -w /home/jenkins/workspace/ipeline-2_chore_jenkins-pipeline -v /home/jenkins/workspace/ipeline-2_chore_jenkins-pipeline:/home/jenkins/workspace/ipeline-2_chore_jenkins-pipeline:rw,z -v /home/jenkins/workspace/ipeline-2_chore_jenkins-pipeline@tmp:/home/jenkins/workspace/ipeline-2_chore_jenkins-pipeline@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 ******** -e ******** -e ******** -e ******** -e ******** -e ******** 181ef0bcb3bf204f1879365a51eb4f056599fcbc cat
$ docker top c669acb2b4a88c4ea0cfc1f5682f2cfd2a41052235767ac330800f7bcd6b35b4 -eo pid,comm
[Pipeline] {
[Pipeline] sh
+ find . -name '*TestRunner*'
./backend/tests/TestRunner.pas
[Pipeline] sh
+ ./TestRunner --format=xml --all
/home/jenkins/workspace/ipeline-2_chore_jenkins-pipeline@tmp/durable-43156271/script.sh: line 1: ./TestRunner: No such file or directory
[Pipeline] }
$ docker stop --time=1 c669acb2b4a88c4ea0cfc1f5682f2cfd2a41052235767ac330800f7bcd6b35b4
$ docker rm -f c669acb2b4a88c4ea0cfc1f5682f2cfd2a41052235767ac330800f7bcd6b35b4
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Front-end)
Stage "Front-end" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
我调查了容器内的内容,发现的只是来自 Github 的原始源文件。即使日志输出显示 Docker 运行成功,可执行文件也不存在。
有人可以解释发生了什么以及如何解决这个问题吗?我是詹金斯的新手,所以我可能会犯一个基本错误。
解决方案
推荐阅读
- r - 计算日期范围 R 内的观测值
- javascript - 如何在 React 中将 html 视频标签附加到 div
- android-studio - Android Studio JAVA_HOME 设置正确但不正确?
- c++ - C++11 lambda 是否保证有 operator()?
- node.js - Nodejs请求正文项目计数
- r - 如何在 R 中创建表格并获得输出 n pdf 或 word?
- python - Pandas 滚动时间窗口因字符串计数而失败 - 为什么?
- javascript - 带有进度条的 JavaScript 倒数计时器
- elasticsearch - 如何提高 Elastic Search 中查询的搜索速度?
- jquery - Ajax post函数不在列表中显示数据