docker - 在 Docker 构建时创建动态环境变量

标签 docker

我的具体用例是我想组织一些有关运行容器的 EC2 实例的数据,并将 i 用作环境变量。我想在构建容器时执行此操作。

我希望能够在我的 Dockerfile 中执行类似 ENV VAR_NAME $(./script/that/gets/var) 之类的操作,但不出所料,这不起作用(您只需获取字符串$(./script...).

我应该提一下,我知道 docker run --env... 会这样做,但我特别希望将它内置到容器中。

我是否遗漏了一些明显的东西?这甚至可能吗?

最佳答案

Docker v1.9 或更新版本

如果您使用的是 Docker v1.9 或更新版本,这可以通过对构建时间参数的支持来实现。 using the ARG statementDockerfile 中声明参数.

ARG REQUIRED_ARGUMENT
ARG OPTIONAL_ARGUMENT=default_value

当您稍后实际使用 docker build 构建镜像时,您可以通过标志 --build-arg 传递参数,如 docker docs 中所述。 .

$ docker build --build-arg REQUIRED_ARGUMENT=this-is-required .

请注意,建议将构建时变量用于密码或 key 或凭据等 secret 。

此外,构建时变量可能有 great impact on caching .因此,Dockerfile 的构建应该非常小心,以便能够尽可能地利用缓存,从而加快构建过程。

编辑:从 leedm777:s answer 输入后添加了“比 v1.9 更新的 docker”部分。 .


Docker v1.9 之前的版本

如果您使用的是 1.9 之前的 Docker 版本,则无法使用 ARG/--build-arg 方法。您无法在构建期间解析此类信息,因此您必须将它们作为参数传递给 docker run 命令。

Docker 图像将随着时间的推移保持一致,而容器可以调整并被视为“丢弃进程”。

解决此问题的旧方法是使用模板。这不是一个简洁的解决方案,但在当时是极少数可行的选择之一。 (灵感来自 this discussion )。

  1. 将所有动态数据保存在 json 或 yaml 文件中
  2. 创建一个 docker 文件"template",以后可以在其中展开动态
  3. 编写一个脚本,使用您熟悉的模板库从配置数据创建 Dockerfile

关于docker - 在 Docker 构建时创建动态环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27711304/

相关文章:

mongodb - docker-compose 抑制 mongodb 输出

docker run -v & .dockerignore 试图忽略文件夹

python-3.x - 如何在 docker 容器中将 python2 别名为 python3?

docker - 如何使用 dotnet sdk linux docker 镜像和从 Windows 10 安装的卷运行 dotnet restore?

elasticsearch - docker - 麋鹿 - vm.max_map_count

ubuntu - apt-get 命令在 docker 容器中不起作用

Grails 3.1.4 和 Docker - grails 命令返回 "No profile found for name web"

ssl - Windows Server 2016 TP3 上为 Docker 存储的 TLS 证书在哪里

docker - 使用:docker build -t myapp。无法成功获取图像

networking - 如何将在 boot2docker 中运行的 Docker 容器连接到在另一台主机上运行的网络服务?