Dockerfile中执行sed命令并将结果存入新变量的问题
Docker中sed替换后变量为空的解决方法
问题根源
Docker的每个RUN指令都会启动独立的shell进程,进程间的环境变量无法共享。你在第一个RUN里导出的ZIP_FILE_NAME仅在当前进程生效,第二个RUN是全新进程,自然读取不到该变量。
解决方案
方案1:合并命令到同一个RUN
将变量赋值与echo命令放在同一个RUN中,确保它们在同一个shell进程内执行:
RUN ZIP_FILE_NAME=$(echo ${JOB_NAME_WITH_VERSION} | sed 's/\(.*\)\./\1_/') && \ echo "Zip file Name found : $ZIP_FILE_NAME"
方案2:用ENV持久化变量
如果需要在后续RUN指令或容器运行阶段复用该变量,可通过ENV指令将变量持久化到镜像环境中:
# 假设JOB_NAME_WITH_VERSION是构建时传入的参数 ARG JOB_NAME_WITH_VERSION RUN ZIP_FILE_NAME=$(echo ${JOB_NAME_WITH_VERSION} | sed 's/\(.*\)\./\1_/') ENV ZIP_FILE_NAME=${ZIP_FILE_NAME} RUN echo "Zip file Name found : $ZIP_FILE_NAME"
可选:优化sed替换命令
替换最后一个.为_还可以用反转字符串的方式实现,逻辑更直观:
ZIP_FILE_NAME=$(echo ${JOB_NAME_WITH_VERSION} | rev | sed 's/\./_/' | rev)
原理是先反转字符串,替换第一个.为_后再反转回来,最终效果等价于替换原字符串的最后一个.。
内容的提问来源于stack exchange,提问作者Safus09
相关产品推荐
相关产品推荐

