docker - Jenkins 的 K8s 插件 : Always running two separate containers inside a pod

标签 docker jenkins kubernetes jenkins-plugins

我已经创建了一个Dockerfile(用于一个节点JNLP slave,它可以与Jenkins 的Kubernetes 插件 一起使用)。我是从官方镜像 jenkinsci/jnlp-slave

扩展而来的
FROM jenkinsci/jnlp-slave

USER root


MAINTAINER Aryak Sengupta <aryak.sengupta@hyland.com>
LABEL Description="Image for NodeJS slave"

COPY cert.crt /usr/local/share/ca-certificates
RUN update-ca-certificates

RUN curl -sL https://deb.nodesource.com/setup_8.x | bash \
    && apt-get install -y nodejs

ENTRYPOINT ["jenkins-slave"]

我将这张图片保存在我的 Pod 模板中(在 K8s 插件配置中)。现在,当我尝试在此 slave 上运行构建时,我发现 Pod 内生成了两个容器(截图证明了这一点。)。

enter image description here

我的 Pod 模板如下所示:

enter image description here

我的 Kubernetes 配置如下所示: enter image description here

现在,如果我执行一个简单的 docker ps,我发现有两个容器启动了(为什么?):

enter image description here

现在,在 Jenkins 的 Jenkins Job 配置中,无论我在构建步骤中添加什么,这些步骤都会在第一个容器中执行。

即使我在我的 PodTemplate 中使用官方的 Node 容器,结果仍然是一样的:

enter image description here

我试图在我的 Jenkins 作业中打印 Node 版本,输出是 "Node not found" 。此外,为了验证我的臀部,我在第二个容器中执行了 docker exec 并尝试打印 Node 版本。在这种情况下,它工作得很好。

这是我的构建步骤:

enter image description here

所以,归结起来,我有两个主要问题:

  1. 为什么每当我启动 Jenkins Job 时,两个 分开的容器(一个用于 JNLP,一个用于所有自定义更改)容器都会启动?
  2. 为什么我的作业在第一个未安装 Node 的容器上运行?如何使用此配置实现使用 Node 构建项目的预期行为?

我错过了什么?

附言- 如果问题的某些部分不清楚,请告诉我。

编辑:我知道这可以使用 Pipeline Jenkins 插件来完成,我可以在其中明确提及 container 名称,但我需要从 Jenkins UI 执行此操作.有什么方法可以指定容器名称以及我已经这样做的从属名称:

enter image description here

最佳答案

Jenkins kubernetes 插件将始终在为执行构建而创建的 pod 中创建一个 JNLP 从属容器。 podTemplate 是您定义执行构建所需的其他容器的地方。

在这种情况下,您似乎想要将一个 Node 容器添加到您的 podTemplate。在您的构建中,您可以在指定的 Node 容器内进行构建。

你真的不应该关心 Pod 在哪里运行。您需要做的就是确保添加一个容器,其中包含您需要的资源(如本例中的 Node)。您可以向 podTemplate 添加任意数量的容器。我有一些带有 10 个或更多容器的容器,用于 PMD、Maven、curl 等步骤。

我使用带有管道的 Jenkinsfile。

podTemplate(cloud: 'k8s-houston', label: 'api-hire-build', 
  containers: [
    containerTemplate(name: 'maven', image: 'maven:3-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
    containerTemplate(name: 'pmd', image: 'stash.company.com:8443/pmd:pmd-bin-5.5.4', alwaysPullImage: false, ttyEnabled: true, command: 'cat')
  ],
  volumes: [
    persistentVolumeClaim(claimName: 'jenkins-pv-claim', mountPath: '/mvn/.m2nrepo')
  ]
)
{
  node('api-hire-build') {
    stage('Maven compile') {
      container('maven') {
        sh "mvn -Dmaven.repo.local=/mvn/.m2nrepo/repository clean compile"
      }
    }
    stage('PMD SCA (docker)') {
      container('pmd') {
        sh 'run.sh pmd -d "$PWD"/src -f xml -reportfile "$PWD"/target/pmd.xml -failOnViolation false -rulesets java-basic,java-design,java-unusedcode -language java'
        sh 'run.sh pmd -d "$PWD"/src -f html -reportfile "$PWD"/target/pmdreport.html -failOnViolation false -rulesets java-basic,java-design,java-unusedcode -language java'
        sh 'run.sh cpd --files "$PWD"/src --minimum-tokens 100 --failOnViolation false --language java --format xml > "$PWD"/target/duplicate-code.xml'
      }
      archive 'target/duplicate-code.xml'
      step([$class: 'PmdPublisher', pattern: 'target/pmd.xml'])
    }
  }
}

关于docker - Jenkins 的 K8s 插件 : Always running two separate containers inside a pod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50624461/

相关文章:

jenkins - 将当前工作空间路径存储在变量中以供后续阶段使用

kubernetes - 添加istio导出网关后,Pod无法curl外部网站

python - 尝试在 docker 容器中访问我的 Flask 应用程序时出现套接字挂断错误

c# - 从C#docker访问kubernetes服务

php - Dockerized PHP应用程序架构最佳实践

java - 以编程方式访问 Jenkins URL?

jenkins - 通过 SSH 发布无效私钥

kubernetes - 没有为 AdmissionController 中的 env 条目获取 ConfigMapKeyRef

nginx - 陷入 Terraform 到 Kubernetes 的部分 helm 发布中

docker - 在docker中提交正在运行的容器是 "safe"吗?