我正在写一个 Jenkins 管道。我正在创建一个 docker 镜像,该镜像运行来自 python virtualenv 的命令(在镜像内部)。我在创建 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
难道我做错了什么 ?
最佳答案
如果您仔细查看 Jenkins 日志,docker run
它执行的命令做了很多事情来模拟工作空间环境。 image.inside { ... }
将工作区目录绑定(bind)挂载到容器中的同一路径,将当前目录覆盖为工作区目录,并覆盖默认命令等。
我认为这里有两个不错的选择:
sh
时显式指定程序的绝对路径命令。dockerImage.inside() {
sh '/app/venv/bin/isort src'
}
image.run
“正常”运行图像,可能使用 -v
将工作区目录的部分绑定(bind)挂载到容器中的选项。这与您 docker run
的方式相同容器。dockerImage.run("-v ${env.WORKSPACE}/src:/app/src")
这个结构可以运行任何默认的
CMD
在你的形象中;问题中的 Dockerfile 似乎缺少该行。 关于docker.image().inside() 不在我的图像中运行 sh 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57851866/