在Docker容器中永久更新PATH环境变量


73

我尝试添加到PATH文件中~/.profile/etc/profile如下所示。

PATH = $PATH:/required/path

但是,它不起作用。然后,我尝试添加行显示,但该行显示也不起作用。

export PATH

即使重新启动容器和主机,它也无法工作。


问题是在创建容器并进行了一些修改之后。在使用Docker配置文件创建容器时不可以。
user859375 2015年

Answers:


138

如果要/new/pathDockerfile中包含a ,请添加以下行:

ENV PATH "$PATH:/new/path"

Dockerfile中应该可以工作。


7
请注意,引号很重要。
orodbhen

1
这有效,但不适用于所有用户。知道如何让所有人都能使用它吗?
MrUpsidown

使用ENV不可能,相反,您必须使用类似于/ etc / environment的方法:github.com/moby/moby/issues/15383
kossmoboleat

1
这对我来说很好。我需要在映像中添加JDK(我不能只使用apt安装,而必须单独下载和提取),所以我添加了ENV JAVA_HOME“ / path / to / jdk”和ENV PATH“ $ {JAVA_HOME} / bin:$ {PATH}”。重建映像后,构建用户即可使用JDK。
Spanky Quigman


11

我在irc聊天中得到了这个问题的答案。此处给出的是对可能遇到此问题的任何人的利益。许多人在更新时给出了错误的答案,~/.profile但没有用。因此,请使用以下答案。

更新文件~/.bashrc的用户或更新文件的/etc/enviroment全局性,这将适用于所有用户的全球变化。

.bashrc导出路径中:export PATH=$PATH:/new/path/bin

在环境中: PATH=$PATH:/new/path/bin


考虑到与Docker有关的问题,我认为Jason Gao的答案应该是公认的。更新bash配置文件是在标准非容器化环境中存储变量的一种好方法,但是如果要在容器中进行部署,它可以更干净地在Dockerfile中包含ENV步骤。
NiallJG

1
根据此Ubuntu文档,“在环境中”的方法不正确(注意:变量扩展在/ etc / environment中不起作用。)。help.ubuntu.com/community/…–
危险

因此,设置.bashrc文件似乎仅在作为交互式终端运行时才起作用,这很有意义,因为它将运行用户的默认外壳程序。除非您通过bash发送命令,否则使用该文件将无法在容器内运行命令。
亚历克斯·巴克

10

1.正确答案

投票最好的答案建议添加ENV PATH "$PATH:/new/path"Dockerfile中,这确实应该起作用。

2.那为什么对我不起作用?

如某些评论/答案中所述,解决方案1.对某些人不起作用。

原因是PATH可以被某些脚本覆盖,例如.bashrc在运行docker容器时,因此给人的印象是ENV PATH...不起作用,但理论上可以。

要解决此问题,您需要通过将以下命令添加到Dockerfile中来添加.bashrc正确PATH的名称:

RUN echo "export PATH=/new/path:${PATH}" >> /root/.bashrc


好的,但是如何重新加载环境,以便bash看到更改?
亚历山大

0

这是我的docker文件,在Centos上,我提取并设置了Java主目录路径,并且对我有用。

Dockerfile:

FROM  centos:7
RUN yum update -y yum install -y tar
COPY jdk-7u80-linux-x64.tar.gz /opt/
WORKDIR /opt
RUN tar -xvf jdk-7u80-linux-x64.tar.gz
RUN chmod -R 755 jdk1.7.0_80
RUN echo export JAVA_HOME=/opt/jdk1.7.0_80 >> /etc/profile
RUN echo export PATH='$PATH:$JAVA_HOME/bin' >> /etc/profile
ENV JAVA_HOME "/opt/jdk1.7.0_80"
ENV PATH "${JAVA_HOME}/bin:${PATH}"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.