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:
验证操作
- 停止并清理原有容器:
docker-compose down - 构建新镜像并启动服务:
docker-compose up -d --build - 访问Jenkins后台,运行如下测试流水线验证:
pipeline { agent any stages { stage('Verify tools') { steps { sh ''' docker info docker version docker compose version curl --version ''' } } } }
流水线能正常输出Docker相关信息,问题彻底解决。
内容的提问来源于stack exchange,提问作者ServletException
相关产品推荐
相关产品推荐

