首页 > 解决方案 > Docker:将返回值设置为环境变量

问题描述

我正在尝试创建一个临时文件夹,然后将路径设置为环境变量,以便在以后的 Dockerfile 说明中使用:

FROM alpine

RUN export TEMPLATES_DIR=$(mktemp -d)
ENV TEMPLATES_DIR=$TEMPLATES_DIR

RUN echo $TEMPLATES_DIR

以上是我尝试过的,知道如何实现吗?

标签: linuxbashdocker

解决方案


您在 Dockerfile 中运行的任何内容都将永久保存在生成​​的 Docker 映像中。作为一般陈述,您不需要使用环境变量来指定文件系统路径,并且创建“临时”路径没有多大意义。只需选择一条路径;它甚至不需要是“正常”的 Linux 路径,因为容器文件系统是隔离的。

RUN mkdir /templates

程序使用环境变量进行配置是很常见的(这是“12 因素”设计的关键部分),因此您也可以将环境变量设置为固定路径

ENV TEMPLATES_DIR=/templates

在您显示的顺序中,每RUN一步都会创建一个带有新外壳的新容器,因此您在RUN命令中设置的任何环境变量都会在该步骤结束时丢失。您不能以您所描述的方式设置持久性环境变量;在 Docker 中的构建时创建动态环境变量进一步讨论了这一点。

如果它实际上是一个临时目录,并且您打算清理它,那么还有两种可能性。RUN一种是在运行多个命令的单个步骤中完成您需要的所有工作。环境变量不会超过该RUN步骤,但可以在其中访问。

RUN export TEMPLATES_DIR=$(mktemp -d) \
 && echo "$TEMPLATES_DIR" \
 && rm -rf "$TEMPLATES_DIR"

第二种方法是使用多阶段构建在一个映像中完成“临时”工作,然后将其“永久”部分从该映像复制到您实际交付的最终映像中。


推荐阅读