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
,这意味着什么?它有效吗?@过度交换不有效,我不知道为什么。出于某种原因,只有当您像我的示例中那样显式定义了变量时,它才起作用。