gpt4 book ai didi

docker.image().inside() 不在我的图像中运行 sh 命令

转载 作者:行者123 更新时间:2023-12-02 19:23:51 24 4
gpt4 key购买 nike

我正在写一个 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/

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