docker - Jenkins sh 脚本在特定容器中运行时挂起

标签 docker jenkins kubernetes continuous-integration sh

我正在尝试使用官方 ArgoCD docker 镜像 ( https://hub.docker.com/r/argoproj/argocd/dockerfile ) 自动化部署

我使用 kubernetes 插件为代理创建了一个声明性 jenkins 管道,并使用 yaml 定义了 pod,容器定义如下所示:

pipeline {
    agent {
        kubernetes {
            yaml """
kind: Pod
metadata:
  name: agent
spec:
  containers:
  - name: maven
    image: maven:slim
    command:
    - cat
    tty: true
    volumeMounts:
      - name: jenkins-maven-cache
        mountPath: /root/.m2/repository
  - name: argocd
    image: argoproj/argocd:latest
    command:
    - cat
    tty: true
    ...

我正在尝试在该容器内运行命令,管道中的步骤如下所示:

stage('Build') {
    steps {
        container('maven') {
            sh 'echo testing' // this works just fine
        }
    }
}
stage('Deploy') {
    steps {
        container('argocd') {
            sh "echo testing" // this does not work
            // more deploy scripts here, once sh works
        }
    }
}

所以我有两个容器,一个容器中 sh 脚本工作正常,另一个容器则不能。 “argocd”容器中的 sh 脚本仅挂起 5 分钟,然后 Jenkins 将其杀死,退出消息为: 进程显然从未在/home/jenkins/agent/workspace/job-name@tmp/durable-46cefcae 中启动(使用 -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS=true 临时运行 Jenkins 可能会使问题更清楚)

我无法在这个特定容器中回显简单的字符串。

它在其他容器中运行良好,例如 Docker 的 Maven 官方容器,我用它来构建 Spring Boot 应用程序。我还可以使用 docker exec 从命令行直接在 argocd 容器中手动运行命令,但由于某种原因,jenkins 不会在管道中运行。 可能是什么?

我正在运行最新版本 (1.33) 的持久任务插件。

更新: 事实证明,argo-cd(持续部署工具)的镜像 argoproj/argocd:latest 不包含除 argocd 之外的其他命令,因此问题出在容器镜像上尝试使用而不是 Jenkins 本身。我的解决方案是将 Argo-CD CLI 安装到自定义 docker 容器中,并使用它而不是官方容器。

最佳答案

我刚刚在自己创建的自定义 docker 镜像中遇到了类似的问题。 事实证明,我在该镜像的 Dockerfile 中使用了 USERbody ,这样 Jenkins 代理 pod 就无法从我的管道运行 cat 命令或任何其他 shell 命令脚本。使用 root 用户运行特定容器对我有用。

因此,在您的情况下,我会添加 securityContext: runAsUser: 0 ,如下所示。

...
  - name: argocd
    image: argoproj/argocd:latest
    command:
    - cat
    tty: true
    securityContext:
      runAsUser: 0
...

Kubernetes 引用:https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container

关于docker - Jenkins sh 脚本在特定容器中运行时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59040347/

相关文章:

kubernetes - 当下游服务抛出 5xx(500、502、503、504)错误时,Istio 断路器不会在连续错误上打开电路

docker - 在Docker桥上访问服务

docker - 无法将容器镜像部署到 Cloud Run

python - 通过带有参数的入口点函数启动 docker 容器

jenkins - 如何知道 Jenkins 作业是否已被另一个 Jenkins 作业触发?

Kubernetes Ingress proxy-body-size 注释已停止工作

kubernetes - Air-flow dag 示例利用 Kubernetes Operator 使用集群 api_key 在 Kubernetes 集群中部署 pod

docker - 为什么在 docker-compose.yml 中使用多个 env_file 时变量替换不起作用?

jenkins - 使用 dotnet Restore 设置 npm 私有(private)注册表

jenkins - 使用 Jenkins 声明性管道从其他作业获取工件