如何基于dind镜像编写Dockerfile安装Jenkins,解决密钥文件不存在报错
报错修复方案
根因分析
你当前使用的基础镜像docker:20.10.11-dind-alpine3.14属于Alpine Linux发行版,而你照搬的是Debian/Ubuntu系的Jenkins安装逻辑,二者完全不兼容,触发报错的具体原因有三个:
- Alpine Linux使用
apk作为包管理器,没有内置apt命令,也不存在/usr/share/keyrings、/etc/apt/sources.list.d这类Debian系专属的系统路径 - 你编写的RUN命令存在语法错误,
tee命令的输出目标被拆分到了独立行,导致Shell直接把路径当作可执行文件运行,直接触发文件不存在的报错 - Jenkins运行依赖Java环境,你原有命令中没有安装对应依赖,就算路径问题解决也无法正常安装运行
修复方案
方案一(推荐):换用Debian系dind基础镜像,适配官方安装逻辑
Debian系环境是Jenkins官方推荐的运行环境,兼容性更好,修正后的Dockerfile如下:
# 换用Debian版本的dind基础镜像 FROM docker:20.10.11-dind USER root RUN apt-get update && apt-get install -y curl gnupg2 &&\ # 导入Jenkins官方GPG密钥 curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | gpg --dearmor -o /usr/share/keyrings/jenkins-keyring.asc &&\ # 配置Jenkins软件源 echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/" > /etc/apt/sources.list.d/jenkins.list &&\ # 安装Java依赖、Jenkins、nodejs、npm apt-get update &&\ apt-get install -y openjdk-11-jdk jenkins nodejs npm &&\ # 清理安装缓存减小镜像体积 apt-get clean && rm -rf /var/lib/apt/lists/*
方案二:保留Alpine系dind基础镜像的修复方式
如果需要继续使用Alpine镜像,建议直接通过官方Jenkins war包安装,避免适配包源的兼容性问题,修正后的Dockerfile如下:
FROM docker:20.10.11-dind-alpine3.14 USER root RUN apk update && apk upgrade &&\ # 安装Java运行环境、curl、nodejs、npm apk add --no-cache openjdk11-jre curl nodejs npm &&\ # 下载最新稳定版Jenkins war包 curl -fsSL https://get.jenkins.io/war-stable/latest/jenkins.war -o /opt/jenkins.war &&\ # 配置Jenkins运行用户与工作目录 adduser -D jenkins && mkdir -p /var/jenkins_home && chown -R jenkins:jenkins /var/jenkins_home /opt/jenkins.war # 配置运行参数 USER jenkins ENV JENKINS_HOME=/var/jenkins_home EXPOSE 8080 50000 ENTRYPOINT ["java", "-jar", "/opt/jenkins.war"]
内容的提问来源于stack exchange,提问作者mostafa nadi
相关产品推荐
相关产品推荐

