linux - Docker:将返回值设置为环境变量
问题描述
我正在尝试创建一个临时文件夹,然后将路径设置为环境变量,以便在以后的 Dockerfile 说明中使用:
FROM alpine
RUN export TEMPLATES_DIR=$(mktemp -d)
ENV TEMPLATES_DIR=$TEMPLATES_DIR
RUN echo $TEMPLATES_DIR
以上是我尝试过的,知道如何实现吗?
解决方案
您在 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"
第二种方法是使用多阶段构建在一个映像中完成“临时”工作,然后将其“永久”部分从该映像复制到您实际交付的最终映像中。
推荐阅读
- django - 如何在 django 中使用 vue?
- c - 多个 dlopen 和 RTLD_NEXT
- python - 我的素数查找程序陷入无限循环
- python - 在python中通过多行/列键值匹配获得比率的任何快捷方式?
- regex - 版本字符串的 POSIX 正则表达式
- java - 整数字符串检查器
- c# - “不允许从 MonoBehaviour 构造函数调用加载”在不从 MonoBehaviour 继承的脚本上
- c# - 在 VS2015/C# 中使用存储过程创建 ADO.NET 只读 SQL Server 数据集
- php - 无法从数据库中获取单个字段
- css - 如何设置滚动的大小来扩大屏幕的大小?