【问题标题】:Dependencies installed with Dockerfile are inaccessible in later pipeline steps. How to enable?使用 Dockerfile 安装的依赖项在后续管道步骤中无法访问。如何启用?
【发布时间】:2018-12-29 14:57:22
【问题描述】:

目前正在使用 Jenkins Blue Ocean 尝试设置新管道。这是一个基于节点的项目,我在 Dockerfile 中成功运行npm install,但是后面的管道步骤看不到安装的node_modules。这种行为很奇怪。

Jenkins 文件。

pipeline {
  agent {
    dockerfile {
      filename 'Dockerfile.prod'
    }
  }
  stages {
    stage('Test') {
      steps {
        sh 'ls node_modules'
      }
    }
  }
}

Dockerfile.prod

FROM node:8

ADD . /var/www    
WORKDIR /var/www
RUN ["npm", "install"]

在 Dockerfile 构建期间:

Step 4/4 : RUN ["npm", "install"]

 ---> Running in de3cd138a40e
...
added 1283 packages in 39.842s

Removing intermediate container de3cd138a40e

在 Jenkinsfile 的 test 阶段:

+ ls node_modules

ls: cannot access node_modules: No such file or directory

【问题讨论】:

  • 我从未使用过此设置,但您确定您的ls node_nodules 命令正在容器内运行吗?您的 Dockerfile 正在将所有依赖项安装在 Docker 映像中,因此如果不运行容器,它们就无法在外部访问。
  • 感谢@IgorNikolaev 的回复!因此,根据此处找到的文档jenkins.io/doc/book/pipeline/syntax/#agent-example,如果 dockerfile 代理是在根级别定义的,则所有阶段都应在其中执行。我尝试在 Dockerfile 中设置 ENV,当我运行 sh 步骤时,它正在回显正确的值。奇怪。

标签: docker jenkins jenkins-pipeline jenkins-blueocean


【解决方案1】:

问题已解决。在 Jenkins 编译初始 dockerfile 之后,对于后面的管道步骤,它会正确启动它。但是,如果查看作业日志(不在 blueocean 视图中),则可以看到 Jenkins 在启动容器 docker run -t -d -u 1000:1000 -w /var/jenkins_home/workspace/workspace_name 时覆盖了 WORKDIR。因此需要手动导航到预期的WORKDIR

【讨论】:

  • 根据文档,您还可以在构建容器时提供额外的args。所以你可以尝试动态设置WORKDIR。为此,您需要定义一个环境变量,然后您可以将其分配给WORKDIR。但是 Docker 文档 (docs.docker.com/engine/reference/builder/#workdir) 说你只能使用在Dockerfile 中显式设置的环境变量,但你可以使用ARGENV 传递一个值:)
  • 但这也意味着您不能在后续构建中重复使用该映像,除非您全局安装您的节点模块。
  • 当然,如果您尝试传入 -w jenkins 似乎会优先考虑,因为它稍后会发生。希望它是可配置的,但我看到了一些相关的问题,所以希望它得到解决。
  • @dmitri-farkov 你到底做了什么?因为我尝试将 args 传递给 docker,但没有成功。
猜你喜欢
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 2021-04-21
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多