docker.image()。inside()在我的映像中未运行sh命令

时间:2019-09-09 10:07:52

标签: docker jenkins jenkins-pipeline

我正在编写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

我做错什么了吗?

1 个答案:

答案 0 :(得分:1)

如果您仔细查看Jenkins日志,它执行的docker run命令会在模拟工作空间环境方面做很多事情。 image.inside { ... }将工作空间目录绑定到同一路径的容器中,将当前目录覆盖为工作空间目录,并覆盖默认命令。

我认为这里有两个不错的选择:

  1. sh命令时明确指定程序的绝对路径。

    dockerImage.inside() {
      sh '/app/venv/bin/isort src'
    }
    
  2. 使用image.run“正常”运行映像,也许使用-v选项将工作区目录的某些部分绑定安装到容器中。这与您docker run容器的方式相同。

    dockerImage.run("-v ${env.WORKSPACE}/src:/app/src")
    

    无论您的图像中是否使用默认CMD,此构造都可以运行;问题中的Dockerfile中似乎缺少该行。