将主机环境变量传递给Dockerfile

20

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

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

echo $USER
taha

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

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

2
可能是以下问题的重复:在Dockerfile中获取环境变量的值 - callmemath
4个回答

19

我曾经遇到同样的问题。我的解决方案是在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,我对此还很陌生,我会尝试并告诉你它是否有效,希望如此 :) - user5524899

6
当您启动Docker容器时,可以使用-e选项传递环境变量, 如下所示:
docker run -it <image> -e USER=$USER /bin/bash 

太好了,如果您的ENV变量是指向主机上非常敏感的文件路径(不想将文件复制到容器中),该怎么办?创建一个卷来访问该文件? - hzitoun
1
你可以简化为 docker run -it <image> -e USER /bin/bash - Joshua Coady
@hzitoun 是的,根据您的情况,可以将其挂载以进行访问。 - Joshua Coady

1
我有一个类似的用例,希望能够指定图像的版本。这需要稍微额外的要求,即您必须在 FROM 之前指定 ARG
首先,在 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 compose文档中args所述:

添加构建参数,这些参数是仅在构建过程中访问的环境变量。

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

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

只要您在环境中设置了IMAGE_VERSION,它就会被传递。

-4

从 centos:centos7 镜像构建环境,设置 myuser 变量为当前用户,命令为 echo $myuser,但是它并没有打印出用户名。 - user5524899
这不会从主机机器中获取$USER的值。 - Ankur Bhatia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接