Dockerfile中环境变量无法echo输出的问题求助
Docker构建中环境变量无法输出的问题
问题描述
我使用以下Dockerfile构建镜像:
FROM node:16.15.1-buster RUN npm pkg get version RUN VERSION=$(npm pkg get version) RUN echo "$VERSION"
执行构建命令:
docker build --progress plain --no-cache -t test-image-1 app/
构建输出显示步骤2能正常返回版本号"0.1.0",但步骤4的echo输出为空。我尝试改用ENV定义变量,依然无法输出$VERSION的值:
FROM node:16.15.1-buster RUN npm pkg get version ENV VERSION $(npm pkg get version) RUN echo "$VERSION"
原因分析及解决方案
1. RUN命令变量无法跨步骤传递的原因
Docker中每个RUN命令都会启动一个独立的Shell进程执行,进程执行完毕后,其内部定义的所有变量都会被销毁,不会传递到后续的RUN步骤。所以步骤3中定义的VERSION变量,在步骤4的Shell进程中不存在,自然输出为空。
解决方法:将需要共享变量的命令合并到同一个RUN中,用&&连接,让它们在同一个Shell进程内执行:
FROM node:16.15.1-buster RUN npm pkg get version && \ VERSION=$(npm pkg get version | sed 's/"//g') && \ echo "$VERSION"
2. ENV命令无法正常赋值的原因
npm pkg get version的输出默认带双引号(比如"0.1.0"),直接用ENV VERSION $(npm pkg get version)赋值时,Docker会把带引号的内容直接赋值给变量,甚至可能因为Shell解析问题导致赋值异常。另外,即使变量赋值成功,若不处理引号,后续使用也会包含多余的引号。
解决方法:先处理npm pkg get的输出,去掉引号后再赋值:
- 方法一:使用
sed去除引号
FROM node:16.15.1-buster ENV VERSION=$(npm pkg get version | sed 's/"//g') RUN echo "$VERSION"
- 方法二:使用
jq(需先安装)提取纯净版本号
FROM node:16.15.1-buster RUN apt-get update && apt-get install -y --no-install-recommends jq && rm -rf /var/lib/apt/lists/* ENV VERSION=$(npm pkg get version | jq -r .) RUN echo "$VERSION"
内容的提问来源于stack exchange,提问作者HelmBurger
相关产品推荐
相关产品推荐

