我尝试添加到文件~/.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}"