Docker RUN 持久化环境变量?

标签 docker docker-compose

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 引擎将解释如下指令:

  1. RUN . /etc/os-release : 从图像启动一个中间容器 bitnami/minideb:latest , 和 source文件 /etc/os-release ,然后将此容器提交给具有 id 的图像(假设 ab12 )
  2. RUN echo "code1=${VERSION_CODENAME}" : 从图像启动另一个中间容器ab12 ,这是在上一步中提交的。 docker 引擎运行 echo "code1=${VERSION_CODENAME}"在这个容器中,然后将其提交到另一个图像 cd34
  3. 与 2 相同,但 sourceecho在同一个中间容器中执行。

显然,在第 1 步和第 2 步中,sourceecho命令在不同的容器中运行,这就是您无法获取所需变量的原因。

因此,ENV说明是解决您的问题的推荐方法。但是,如果您真的需要从文件中读取 envs,这里有一个解决方法。

  1. 准备一个名为my-env.sh的文件:
#!/bin/bash
export ENV1=XXX
export ENV2=XXX
# ...
  1. 准备一个名为entrypoint.sh的文件:
#!/bin/bash
. /my-env.sh

# rest of the things you wanna do when start this image into a container
  1. 准备 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"]
  1. 通过 docker build -t <repo:tag> . 构建图像.在构建图像之前,您当前的工作目录应包含:
    • 我的环境.sh
    • 入口点.sh
    • docker 文件

祝你好运!

关于Docker RUN 持久化环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59814358/

相关文章:

docker - 无法在主节点上运行kubernetes仪表板

Docker Compose - 使用容器环境变量的命令

nginx - docker-compose run ,链接到之前运行的容器

docker - 使用 docker-compose 时 redis_slave 无法访问 redis_master

reactjs - "Create React App"与 Docker

ruby-on-rails - Rails将请求发送到其他容器[无法打开TCP连接]

r - 如何在 docker 中加速 R 包的安装

docker - docker 参数 --net=container :ReportWeb in the docker run command 的 docker-compose 等价物是什么

node.js - 带有 docker 的 Nodejs 端口无法访问

linux - 无法在守护进程模式下运行 docker?