FROM bitnami/minideb:latest
RUN . /etc/os-release
RUN echo "code1=${VERSION_CODENAME}"
RUN . /etc/os-release && echo "code2=${VERSION_CODENAME}"
当我运行它时,它会打印:
code1=
code2=buster
是否有某种方法可以在 RUN 命令和/或单独的命令之间保留环境变量以从容器内的文件加载环境变量?
最佳答案
简而言之,
- 使用
ENV
将环境变量设置为图像。 - 或
source
你的 env 文件在docker run
这是您的 Dockerfile:
FROM bitnami/minideb:latest
RUN . /etc/os-release
RUN echo "code1=${VERSION_CODENAME}"
RUN . /etc/os-release && echo "code2=${VERSION_CODENAME}"
根据您的 Dockerfile,docker 引擎将解释如下指令:
-
RUN . /etc/os-release
: 从图像启动一个中间容器bitnami/minideb:latest
, 和source
文件/etc/os-release
,然后将此容器提交给具有 id 的图像(假设ab12
) -
RUN echo "code1=${VERSION_CODENAME}"
: 从图像启动另一个中间容器ab12
,这是在上一步中提交的。 docker 引擎运行echo "code1=${VERSION_CODENAME}"
在这个容器中,然后将其提交到另一个图像cd34
- 与 2 相同,但
source
和echo
在同一个中间容器中执行。
显然,在第 1 步和第 2 步中,source
和 echo
命令在不同的容器中运行,这就是您无法获取所需变量的原因。
因此,ENV
说明是解决您的问题的推荐方法。但是,如果您真的需要从文件中读取 envs,这里有一个解决方法。
- 准备一个名为
my-env.sh
的文件:
#!/bin/bash
export ENV1=XXX
export ENV2=XXX
# ...
- 准备一个名为
entrypoint.sh
的文件:
#!/bin/bash
. /my-env.sh
# rest of the things you wanna do when start this image into a container
- 准备 Dockerfile:
FROM bitnami/minideb:latest
# copy files from local to image
COPY my-env.sh /my-env.sh
COPY entrypoint.sh /entrypoint.sh
# when start this image into a container, execute the following command
ENTRYPOINT ["bash", "/entrypoint.sh"]
- 通过
docker build -t <repo:tag> .
构建图像.在构建图像之前,您当前的工作目录应包含:- 我的环境.sh
- 入口点.sh
- docker 文件
祝你好运!
关于Docker RUN 持久化环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59814358/