Dockerfile中基于npm包版本设置ENV变量报错如何解决?
报错原因
Dockerfile的ENV指令本身不支持执行Shell命令,仅支持静态键值对格式的赋值。你写的$(npm pkg get version | sed 's/"//g')不会被Docker当作Shell表达式执行展开,Docker解析ENV行时会按空格拆分参数,拆分后第二个参数为BUILD_VERSION=$(npm,第三个参数为pkg,由于ENV要求所有参数都符合name=value的格式,pkg参数中没有等于号,因此触发语法报错。
修复方案
方案1:在Dockerfile内部动态生成环境变量(适合需要镜像内部执行npm获取版本的场景)
放弃用ENV直接赋值,改为通过RUN指令执行Shell命令,将生成的版本号写入系统环境变量配置文件,后续构建步骤和容器运行时都可以正常读取:# 执行npm命令获取版本号,写入全局环境变量配置 RUN echo "BUILD_VERSION=$(npm pkg get version | sed 's/"//g')" >> /etc/environment # 后续构建步骤需要使用时,先source配置文件即可 RUN source /etc/environment && echo $BUILD_VERSION如果使用的是Alpine类轻量镜像,也可以将变量写入
/etc/profile或者~/.bashrc文件中,使用时source对应文件即可。方案2:通过构建参数传入版本号(兼容性最好,不需要镜像内预装npm)
先在Dockerfile中声明构建参数和对应环境变量:# 声明构建参数,接收外部传入的版本号 ARG BUILD_VERSION # 将构建参数赋值给ENV,容器运行时也可以读取该变量 ENV BUILD_VERSION=$BUILD_VERSION构建镜像时,在本地执行npm命令拿到版本号,通过
--build-arg参数传入即可:docker build --build-arg BUILD_VERSION=$(npm pkg get version | sed 's/"//g') .
内容的提问来源于stack exchange,提问作者d-_-b
相关产品推荐
相关产品推荐

