我正在编写Jenkins管道。我正在创建一个从python virtualenv(在图像内部)运行命令的docker图像。我在创建docker映像时正在创建此虚拟环境。当我执行以下操作时:
stage() {
steps {
script {
def dockerImage = docker.build('-f <path_to_dockerfile> .')
dockerImage.inside() {
sh 'venv/bin/isort src'
}
}
}
}
它表示未找到“ venv / bin / isort”。如果我执行“ pwd”操作,则会显示主机jenkins工作区的路径。 Jenkins工作区有一个来自我的git repo的签出副本,并且repo不包含venv(Virtualenv)。但是,我希望这应该返回我的docker容器内的路径。
我的Docker文件:
FROM python:3.6-alpine
RUN apk update && apk add bash && apk add build-base
RUN mkdir /app
WORKDIR /app
COPY requirements /app/requirements
COPY Makefile /app/
RUN make venv/.venv_build
我做错什么了吗?
答案 0 :(得分:1)
如果您仔细查看Jenkins日志,它执行的docker run
命令会在模拟工作空间环境方面做很多事情。 image.inside { ... }
将工作空间目录绑定到同一路径的容器中,将当前目录覆盖为工作空间目录,并覆盖默认命令。
我认为这里有两个不错的选择:
在sh
命令时明确指定程序的绝对路径。
dockerImage.inside() {
sh '/app/venv/bin/isort src'
}
使用image.run
“正常”运行映像,也许使用-v
选项将工作区目录的某些部分绑定安装到容器中。这与您docker run
容器的方式相同。
dockerImage.run("-v ${env.WORKSPACE}/src:/app/src")
无论您的图像中是否使用默认CMD
,此构造都可以运行;问题中的Dockerfile中似乎缺少该行。