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中,如何更新PATH环境变量?_Docker_Dockerhub - Fatal编程技术网

在Dockerfile中,如何更新PATH环境变量?

在Dockerfile中,如何更新PATH环境变量?,docker,dockerhub,Docker,Dockerhub,我有一个dockerfile,可以从源代码下载并构建GTK,但下面的一行没有更新我的映像的环境变量: RUN PATH="/opt/gtk/bin:$PATH" RUN export PATH 我读到我应该使用ENV来设置环境值,但是下面的说明似乎也不起作用: ENV PATH/opt/gtk/bin:$PATH 这是我的整个Dockerfile: FROM ubuntu RUN apt-get update RUN apt-get install -y golang gcc make wge

我有一个dockerfile,可以从源代码下载并构建GTK,但下面的一行没有更新我的映像的环境变量:

RUN PATH="/opt/gtk/bin:$PATH"
RUN export PATH
我读到我应该使用ENV来设置环境值,但是下面的说明似乎也不起作用:

ENV PATH/opt/gtk/bin:$PATH

这是我的整个Dockerfile:

FROM ubuntu
RUN apt-get update
RUN apt-get install -y golang gcc make wget git libxml2-utils libwebkit2gtk-3.0-dev libcairo2 libcairo2-dev libcairo-gobject2 shared-mime-info libgdk-pixbuf2.0-* libglib2-* libatk1.0-* libpango1.0-* xserver-xorg xvfb

# Downloading GTKcd
RUN wget http://ftp.gnome.org/pub/gnome/sources/gtk+/3.12/gtk+-3.12.2.tar.xz
RUN tar xf gtk+-3.12.2.tar.xz
RUN cd gtk+-3.12.2

# Setting environment variables before running configure
RUN CPPFLAGS="-I/opt/gtk/include"
RUN LDFLAGS="-L/opt/gtk/lib"
RUN PKG_CONFIG_PATH="/opt/gtk/lib/pkgconfig"
RUN export CPPFLAGS LDFLAGS PKG_CONFIG_PATH
RUN ./configure --prefix=/opt/gtk
RUN make
RUN make install

# running ldconfig after make install so that the newly installed libraries are found.
RUN ldconfig

# Setting the LD_LIBRARY_PATH environment variable so the systems dynamic linker can find the newly installed libraries.
RUN LD_LIBRARY_PATH="/opt/gtk/lib"

# Updating PATH environment program so that utility binaries installed by the various libraries will be found.
RUN PATH="/opt/gtk/bin:$PATH"
RUN export LD_LIBRARY_PATH PATH

# Collecting garbage
RUN rm -rf gtk+-3.12.2.tar.xz

# creating go code root
RUN mkdir gocode
RUN mkdir gocode/src
RUN mkdir gocode/bin
RUN mkdir gocode/pkg

# Setting the GOROOT and GOPATH enviornment variables, any commands created are automatically added to PATH
RUN GOROOT=/usr/lib/go
RUN GOPATH=/root/gocode
RUN PATH=$GOPATH/bin:$PATH
RUN export GOROOT GOPATH PATH

虽然冈特发布的答案是正确的,但与我已经发布的答案没有什么不同。问题不是
ENV
指令,而是后续指令
runexport$PATH

一旦在Dockerfile中通过
ENV
声明了环境变量,就不需要导出它们

一旦
运行导出…
行被删除,我的映像就成功构建了

您可以在
Dockerfile
中使用,如下所示:

ENV PATH="/opt/gtk/bin:${PATH}"
不鼓励这样做(如果要创建/分发干净的Docker映像),因为
路径
变量是由
/etc/profile
脚本设置的,因此可以覆盖该值

头部/etc/profile

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH
在Dockerfile的末尾,您可以添加:

RUN echo "export PATH=$PATH" > /etc/environment
因此,为所有用户设置路径。

[我在回答所选答案时提到了这一点,但建议将其作为自己的答案更加突出]

应当指出的是

ENV PATH="/opt/gtk/bin:${PATH}" 
可能不一样

ENV PATH="/opt/gtk/bin:$PATH" 

前者带有花括号,可以为您提供主机路径。文档中并没有表明会出现这种情况,但我观察到确实如此。这很容易检查,只需执行
运行echo$PATH
并将其与
运行echo${PATH}

比较,就可以使用ENV not export设置LD_库的路径和路径。您还需要知道,LD_LIBRARY_PATH不应该指向PATH!。删除Dockerfile中的文件不会使您的图像变小,请检查。当前Dockerfile是否有效?@HuiWang它可能无效。它是在1.5年前写的,从那以后发生了很多变化。只需确保合并了所选答案中描述的更改。
=
是否需要等号?@IgorGanapolsky不在本例中,因为它指定的是单个变量。但是,它并不有害,并且在指定多个变量时是必需的。有关详细信息,请参阅。这很有效!请注意
=
它需要没有空格。如果您在
=
旁边添加空格,像这样
ENV PATH=“/opt/gtk/bin:${PATH}”
将使$PATH崩溃,这不会用主机的
$PATH
追加来更新图像吗?
ENV PATH=“/opt/gtk/bin:${PATH}”
可能与
ENV PATH=“/opt gtk/bin:$PATH”不同,前者带有花括号,可能会为您提供主机的路径。文档中并没有表明会出现这种情况,但我观察到确实如此。这很容易检查,只需执行
RUN echo$PATH
并将其与
RUN echo${PATH}
进行比较,
/etc/environment
是赋值表达式的列表,而不是脚本,并且不支持变量扩展,因此
RUN
语法不太可能工作。是的,它将被展开,并且
导出路径=
将被写入
/etc/environment
,这仍然是不正确的,因为该文件不是脚本,而是
=
的列表<代码>导出
可能会使其失败,除非您的系统支持规范之外的一些黑魔法。
运行A=B
运行导出A
,和
运行导出A=B
,都是有效的shell命令,但只影响该
运行
指令后面的命令的环境(但没有给出任何命令)。类似地,如果您有
运行export PATH=/foo;prog1;prog2
(在同一次运行中),路径修改将影响
prog1
prog2
。因此,
runexport$PATH
是一个noop(因为没有程序使用修改过的环境),并且该指令是否存在应该没有区别。你说的“Gunter”是什么意思?修复方法实际上是使用ENV指令更改路径值,而不是运行。当docker builder调用下面的运行时,这些更改将继续进行。使用docker 20.10.2。我刚刚在Mac上用20.10.2进行了尝试,但两者并不相同${PATH}包括我笔记本电脑上的路径(如/Library/…和/Users/…),而$PATH只反映我容器上下文中的路径。最新的一条说明是“环境变量在Dockerfile中用$variable_name或${variable_name}表示。它们被同等对待”Hmmm。。。“同等”并不一定意味着“完全相同”。我建议有兴趣的人检查一下$PATH和${PATH}是否正确。20.10.6仍然有不同的行为。这太疯狂了。我也看到了不同的输出。