将主机环境变量传递给 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 <image> -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-compose 将环境变量传递给 docker 映像