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

标签 docker jenkins jenkins-pipeline

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

    相关文章:

    mongodb - Go mgo.v2包错误: no reachable servers

    node.js - OpenShift 从另一个 Pod 访问 Mongodb Pod

    docker - 在 Nginx 代理后面时,Keycloak Docker 实例中的 X-Frame-Options 拒绝加载

    jenkins - 一个 Jenkins 可以在远程 Jenkins 上触发工作吗

    jenkins-pipeline - 如何在子文件夹中发现 Jenkinsfile

    docker - 从Jenkins Docker容器中旋转Docker/ECS容器

    node.js - Docker + Nodejs + Private Repo + Private NPM Module - 访问问题

    hudson - Checkstyle 和 Findbugs 仅在 Jenkins(和/或 Hudson)上更改文件

    android - Jenkins 在构建 android 项目时停止响应

    jenkins - BlueOcean 使用 SSH key 连接