Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dockerfile-如何使用ENV指令附加路径?_Docker_Dockerfile - Fatal编程技术网

Dockerfile-如何使用ENV指令附加路径?

Dockerfile-如何使用ENV指令附加路径?,docker,dockerfile,Docker,Dockerfile,ENV指令将环境变量设置为该值。此值将在构建阶段的所有后续指令的环境中 以下说明: ENV PATH=$PATH:$HOME/go/bin 不追加路径变量 $HOME/go/bin是/root/go/bin 如何将$HOME/go/bin附加到$PATH?在下面的docker文件中 FROM golang:1.14.10 MAINTAINER xyz ENV GOPATH= ENV PATH=$PATH:$HOME/go/bin RUN echo $PATH 显然Docker不

ENV
指令将环境变量设置为该值。此值将在构建阶段的所有后续指令的环境中


以下说明:

   ENV PATH=$PATH:$HOME/go/bin
不追加
路径
变量

$HOME/go/bin
/root/go/bin

如何将
$HOME/go/bin
附加到
$PATH
?在下面的docker文件中

FROM golang:1.14.10
MAINTAINER xyz

ENV GOPATH=

ENV PATH=$PATH:$HOME/go/bin

RUN echo $PATH

显然Docker不允许您在
ENV
ARG
声明中使用在
Dockerfile
之外定义的环境变量

作为一种解决方法,您可以使用显式地将名称/目录传递给
Dockerfile

FROM golang:1.14.10
    
# set default to `root`
ARG USERNAME=root

ENV PATH=$PATH:/$USERNAME/go/bin

RUN echo $PATH
然后可以通过
docker build--build arg USERNAME=myuser


根据您的用例,您也可以使用
运行
入口点

来实现这一点。我认为混淆之处在于:当您在ENV中说$HOME时,HOME还没有定义。但是当您说runecho$HOME时,HOME是由基本映像中的shell定义的

PATH正在工作并导致混乱,因为它是由您在中使用的基础映像定义的

ENV用于为将要生成的映像定义默认变量,并且可以在RUN语句中访问这些变量。可以这样想:Dockerfile可以向容器提供变量,但容器不能向Dockerfile提供变量


实际上,如果root是您要从中运行的用户,我只需要在/root中硬编码。构建提供的变量是默认值。如果您想做一些新奇和动态的事情,最好在图像中插入一个脚本,然后运行它。

1)我不明白这一点。。“问题是,
$HOME
尚未定义”
$HOME
是否假定在Dockerfile中定义?此行(
ENV PATH=$PATH:$HOME/bin
)在容器中运行,对吗<代码>此处定义了$HOME。。2) 你在回答的下一部分是说
ENV PATH=$PATH:${USERNAME}/go/bin
?@overexchange抱歉,我写这篇文章时很累。你的观点都是正确的。1)
$HOME
已定义,我对问题的原因过于武断。2) 我输入了一个错误,忘记在声明中包含
$USERNAME
,如果
$PATH
&
$HOME
是在docker容器中定义的,那么我试图理解,在
docker文件中写入
环境路径=$PATH:$HOME/go/bin
并运行
docker build
,这意味着什么?它有效吗?@过度交换不有效,我不知道为什么。出于某种原因,只有当您像我的示例中那样显式定义了变量时,它才起作用。