You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins与Docker Compose:添加命令时出现文件或目录不存在错误

在Docker Compose中给Jenkins容器安装Docker客户端时的命令执行错误及解决方案

问题背景

我用Docker Compose部署了包含client、server、db和Jenkins的服务集群,不给Jenkins镜像指定command时容器能正常启动。但因为Jenkins流水线需要调用Docker命令,得在Jenkins容器里安装Docker客户端,尝试在Compose配置里加启动命令时,出现了如下错误:

/usr/local/bin/jenkins.sh: line 49: /apt-get update && curl -sSL https://get.docker.com/ | sh: No such file or directory

我的Jenkinsfile只包含输出Docker、Docker Compose版本的测试命令,当时的Jenkins服务Compose配置如下:

version: '3.7'

# Define services
services:
  jenkins:
    image: jenkins/jenkins:lts
    privileged: true
    user: root
    ports:
      - 8080:8080
      - 50000:50000
    restart: always
    volumes:
      - jenkins-volume:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
      - docker_certs:/certs/client
    # 引发错误的配置
    command:
      - "apt-get update && curl -sSL https://get.docker.com/ | bash"

volumes:
  jenkins-volume:
  docker_certs:

移除这个command配置后,手动进入容器shell执行相同的命令能正常完成安装,Jenkins任务也能正常运行,但把命令写在Compose的command里就会报错。

错误原因

Docker Compose的command字段如果用列表形式(比如- "命令串"),Docker会把整个字符串当作单个可执行文件的路径来处理,而不是交给shell去解析带&&、管道符的复合命令。所以容器会尝试寻找一个名为apt-get update && curl -sSL https://get.docker.com/ | bash的可执行文件,自然找不到,从而抛出“文件不存在”的错误。

最终解决方案

直接通过自定义Dockerfile预安装Docker客户端并配置权限,是更稳定可靠的方式,避免了启动时执行安装命令的问题。

自定义Jenkins镜像的Dockerfile

FROM jenkins/jenkins:lts
USER root
# 更新软件包索引
RUN apt-get update
# 通过官方脚本安装Docker客户端
RUN curl -sSL https://get.docker.com/ | sh
# 将jenkins用户加入docker组,解决后续调用Docker命令的权限问题
RUN usermod -aG docker jenkins

修改后的Docker Compose配置

version: '3.7'

services:
  jenkins:
    privileged: true
    # 改为构建自定义镜像
    build:
      context: ./  # 指定Dockerfile所在的目录
    ports:
      - 8080:8080
      - 50000:50000
    restart: always
    volumes:
      - jenkins-volume:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
      - docker_certs:/certs/client

volumes:
  jenkins-volume:
  docker_certs:

验证操作

  1. 停止并清理原有容器:docker-compose down
  2. 构建新镜像并启动服务:docker-compose up -d --build
  3. 访问Jenkins后台,运行如下测试流水线验证:
pipeline {
    agent any

    stages {
        stage('Verify tools') {
            steps {
                sh '''
                    docker info
                    docker version
                    docker compose version
                    curl --version
                  '''
            }
        }
    }
}

流水线能正常输出Docker相关信息,问题彻底解决。


内容的提问来源于stack exchange,提问作者ServletException

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:30:37