Jenkins通过Groovy插值传密钥到Dockerfile被解析为****问题求助
问题原因
- 你使用Groovy字符串插值传递凭证变量
$NPMRC_FILE时,Jenkins的安全机制会自动将敏感值替换为****,因此最终写入.npmrc的内容就是星号而非真实密钥。 - 收到的安全警告是Jenkins的官方提示:使用Groovy插值传递敏感值存在泄露风险,属于不推荐的用法。
- 额外安全隐患:就算传递成功,build-arg的值可以通过
docker history命令直接查看,密钥会完全泄露。
解决方案
1. 修改Jenkins流水线配置
你使用的是file类型凭证,NPMRC_FILE对应Jenkins Agent上临时存放.npmrc文件的路径,直接将该文件复制到Docker构建上下文即可,无需作为build-arg传递:
stages { stage('Build') { steps { withCredentials([file(credentialsId: 'secretId', variable: 'NPMRC_FILE')]) { // 将凭证文件复制到构建上下文根目录 sh "cp $NPMRC_FILE ./.npmrc" buildDocker dockerFilePath: 'Dockerfile', compName: 'imageName', dockerImage: 'imageName', extraBuildArgs: "--build-arg VERSION=${env.RELEASE_VERSION}.${env.BUILD_NUMBER}" } } post { // 构建完成后无论成功失败都删除本地.npmrc,避免泄露 always { sh "rm -f ./.npmrc" } } } }
同时在项目根目录添加.dockerignore文件,排除.npmrc避免意外提交或打包:
.npmrc
2. 修改Dockerfile配置
删除接收NPMRC的ARG指令,直接在构建阶段使用上下文中的.npmrc文件,注意复制、使用、删除操作要放在同一个RUN指令中,避免密钥残留在镜像层:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base RUN apt-get update && apt-get install -y libgdiplus RUN ls EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build ARG VERSION RUN apt-get update RUN apt-get install -y curl RUN apt-get install -y libpng-dev libjpeg-dev curl libxi6 build-essential libgl1-mesa-glx RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - RUN apt-get install -y nodejs RUN mkdir -p /app WORKDIR /app/ COPY . code/ # 同一RUN指令内完成复制npmrc、还原依赖、删除npmrc操作,无残留 RUN cp code/.npmrc /root/.npmrc \ && dotnet restore "code/pathToProject/projectName.csproj" \ && rm -f /root/.npmrc code/.npmrc RUN dotnet build "code/pathToProject/projectName.csproj" --no-restore /p:Version=$VERSION /p:Company=Company /p:"Copyright=Copyright%20©%20%202019" RUN dotnet publish "code/pathToProject/projectName.csproj" --no-build -o /app/out/ RUN ls -lR out FROM base AS runtime WORKDIR /app COPY --from=build /app/out ./ ENTRYPOINT ["dotnet", "projectName.dll"]
方案优势
- 不再使用Groovy插值传递敏感值,安全警告自动消失,Jenkins也不会再将密钥替换为星号
- 密钥不会出现在build-arg中,无法通过
docker history查询,安全性更高 - 构建完成后,Jenkins Agent和最终镜像内都不会残留.npmrc文件,无泄露风险
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

