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



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

PATH = $PATH:/required/path

然而,它不起作用。然后我试着添加了台词表演,但也不起作用。

export PATH

即使在重新启动容器和主机之后,它也不起作用。

如果要在Dockerfile中包含/new/path,请添加以下行:

ENV PATH "$PATH:/new/path"

中的Dockerfile应该可以工作。

1。正确答案

投票结果最好的答案建议将ENV PATH "$PATH:/new/path"添加到Dockerfile中,这确实应该有效。

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

正如一些评论/答复中所指出的,解决方案1。对某些人不起作用。

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

为了解决这个问题,您需要通过将以下命令添加到Dockerfile来向.bashrc添加正确的PATH

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

在Dockerfile中放入一行ENV PATH xxx,请参阅此Dockerfile的示例https://gist.github.com/deepak/5933685

我在irc聊天中得到了这个问题的答案。为了任何可能遇到这种情况的人的利益。许多人在更新~/.profile时给出了错误的答案,但这并没有奏效。请使用下面的答案。

为用户更新文件~/.bashrc,或为适用于所有用户的全局更改更新文件/etc/enviroment global。

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

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

交互式shell和非交互式shell之间的区别没有被注意到。因此,这就是为什么上述解决方案有时看起来有效,有时无效。

对于非交互式shell,通常会跳过bashrc文件。例如,在Debian中,/etc/bash.bashrc文件非常清楚地指出:

# System-wide .bashrc file for interactive bash(1) shells.
# To enable the settings / commands in this file for login shells as well,
# this file has to be sourced in /etc/profile.
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
  • Dockerfile中的RUN命令调用非交互式shell。并且将采用ENV设置的路径,并且bashrc脚本将不会运行
  • docker run -it <image> /bin/bash调用交互式shell。如果例如PATH没有在任何bashrc脚本中的常用PATH=$PATH:/...语法中定义,则将运行bashrc,并且可以覆盖ENV中设置的任何内容

为了在两种操作模式之间保持安全和一致,可以在Dockerfile中执行以下操作:

ENV PATH /master/go/bin:${PATH}
RUN echo "${PATH}" >> /etc/bash.bashrc

注意,/etc/bash.bashrc是Debian的位置,可能与其他分布图像不同。

这是我的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}"

最新更新