Dockerfile中能否在RUN指令间传递环境变量?如何配置PATH?
Docker RUN指令环境变量不生效的原因及解决办法
这确实是Docker的特性导致的——每个RUN指令都会启动一个独立的shell进程执行命令,进程结束后,该进程内设置的环境变量会被销毁,不会传递到下一个RUN进程中。
要让环境变量(比如PATH)在多个RUN指令中生效,有几种靠谱的方法:
使用
ENV指令:这是Dockerfile中专门用于设置全局环境变量的指令,设置后会在后续所有RUN、CMD、ENTRYPOINT等指令中生效。比如要修改PATH:ENV PATH="/usr/local/new/bin:$PATH" RUN echo $PATH # 这里能读到更新后的PATH在同一个
RUN中执行多步命令:如果只是需要在单次RUN内临时生效,用&&把命令连起来,让它们在同一个shell进程中执行:RUN export FOO=hello && env # 这里能看到FOO变量但这种方式的环境变量不会保留到下一个
RUN。写入shell配置文件(慎用):可以把环境变量写入shell的配置文件(比如
~/.bashrc或/etc/profile),但要注意Docker默认RUN用的是sh而非交互式bash,不会自动加载这些配置。如果要用这种方式,需要在执行命令时手动source配置文件:RUN echo 'export PATH="/usr/local/new/bin:$PATH"' >> ~/.bashrc RUN bash -c 'source ~/.bashrc && echo $PATH'这种方式不如
ENV稳定,因为不同基础镜像的shell配置可能有差异。
内容的提问来源于stack exchange,提问作者yegor256
相关产品推荐
相关产品推荐

