将主机环境变量传递给 dockerfile

Posted

技术标签:

【中文标题】将主机环境变量传递给 dockerfile【英文标题】:Pass host environment variables to dockerfile 【发布时间】:2018-01-08 11:28:37 【问题描述】:

如何将主机环境变量(如用户和主机名)传递给 dockerfile?

例如,如果我的用户名是taha

echo $USER
taha

如何编写我的 Docker 文件以获得相同的输出?

FROM centos:centos7   
ARG myuser=$USER  
CMD echo $myuser

【问题讨论】:

Get environment variable value in Dockerfile的可能重复 【参考方案1】:

我遇到了同样的问题。我的解决方案是在 docker-compose.yml 中提供变量,因为 yml 支持使用环境变量。

在我看来,这对我来说是最有效的方式,因为我不喜欢在命令行中一遍又一遍地使用 docker run -e myuser=$USER . . . 之类的东西输入它

声明ENV myuser=$USER 将不起作用,在容器中,$myuser 将被设置为null

所以你的 docker-compose.yml 可能看起来像这样:

version: '3'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
       - "myuser=$USER"

并且可以使用短命令docker-compose up运行

要检查变量是否已应用,请运行 docker exec -it container-name printenv 以列出容器中的所有变量。

【讨论】:

我想我需要使用 Docker-compose,我是新手,我试试看它是否有效,希望它有效 :)【参考方案2】:

当您启动 docker 容器时,您可以使用 -e 选项传递环境变量,如下所示:

docker run -it <image> -e USER=$USER /bin/bash 

【讨论】:

太好了,当您的 ENV var 是主机中非常敏感文件的路径时该怎么办(不想将文件复制到容器中)?创建一个卷来访问文件? 您可以将其简化为docker run -it &lt;image&gt; -e USER /bin/bash @hzitoun 是的,根据你的情况,挂载访问【参考方案3】:

我有一个类似的用例,我希望能够为图像指定一个版本。这有一个额外的要求,您必须指定ARG before the FROM

首先我们在Dockerfile 中指定IMAGE_VERSION,根据问题,我还包括一个USER 参数,我们也可以传入:

# give it a default of latest
# declare the ARG before FROM
ARG IMAGE_VERSION=latest
FROM centos:$IMAGE_VERSION
ARG myuser  
CMD echo $myuser

然后,从 Docker 撰写文档args:

添加构建参数,它们是只能在构建过程中访问的环境变量。

您可以在docker-compose.yml 中添加这些内容,例如:

version: '3'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        "myuser=$USER"
        IMAGE_VERSION

那么只要你在你的环境中设置了IMAGE_VERSION,它就会通过。

【讨论】:

【参考方案4】:

您需要在 dockerfile 中使用 ENV 设置

ENV myuser=$USER

https://docs.docker.com/engine/reference/builder/#env

【讨论】:

FROM centos:centos7 ENV myuser=$USER CMD echo $myuser 但它不打印用户名 这不会从主机中获取 $USER 的值。

以上是关于将主机环境变量传递给 dockerfile的主要内容,如果未能解决你的问题,请参考以下文章

将所有主机环境变量传递给 docker 容器的最简单方法

在构建时使用 docker-compose 将环境变量传递给 docker 映像

如何将环境变量传递给前端 Web 应用程序?

将文件路径传递给dockerfile作为变量_ nodeJS dockerode Docker

在 Dockerfile 中使用环境变量

在Gitlab中传递--build-arg或在两步Dockerfile中使用环境变量