[英]Why dockerfile ENV cannot override $PATH for non-root user?
我想為非 root 用戶在 ubuntu docker 映像中安裝 miniconda。 到目前為止,安裝部分是成功的,但我無法將 conda 的路徑添加到該用戶的環境變量$PATH
中。 我試圖用 docker ENV
來實現這一點。 這是我的 Dockerfile
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y openssh-server sudo
RUN useradd -rm -d /home/devp -s /bin/bash -g root -G sudo -u 1000 devp && \
echo 'devp:devp11' | chpasswd && \
adduser devp sudo
WORKDIR /home/devp
USER devp
RUN wget \
https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
&& mkdir ~/.conda \
&& bash Miniconda3-latest-Linux-x86_64.sh -b \
&& rm -f Miniconda3-latest-Linux-x86_64.sh
ENV PATH=/home/devp/miniconda3/bin:${PATH}
ARG PATH=/home/devp/miniconda3/bin:${PATH}
#RUN conda env create --quiet -n env1 --file env1.yml
USER root
RUN mkdir /var/run/sshd
RUN service ssh start
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]
我運行 docker 和docker run --name img -p 10022:22 -d img:tag
對於我的 root 用戶, $PATH
被覆蓋
/home/devp/miniconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
對於我的非 root 用戶,當我ssh devp@xxxx -p 10022 'echo $PATH'
時, $PATH
不會被覆蓋
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
我有兩個問題:
$PATH
?ENV
不適用於非 root 用戶?這里的區別不是源於root 與非 root 用戶,而是源於進程的啟動方式,即直接由 docker 與通過 ssh login 啟動。
使用ENV
指令,您可以指定由docker
為容器內啟動的進程設置的環境變量。 But when logging in via ssh
the new shell presented to you is a login shell started by the ssh
daemon.
但是ssh
在開始登錄shell之前清除並重置了大部分環境變量。 此外,登錄 shell 通常會讀取一些配置文件來設置它自己的環境,而PATH
幾乎總是配置的環境變量之一。
因此,要更改通過ssh
啟動的 shell 的PATH
,您必須在sshd_config
或通過用戶登錄 shell 配置進行配置,例如/etc/profile
、 ~/.bashrc
等。
另請參閱https://unix.stackexchange.com/questions/38175/difference-between-login-shell-and-non-login-shell
但正如David Maze 在評論中所說:不鼓勵在 docker 容器內使用sshd
。 容器不是虛擬機,而是只運行一個進程/應用程序。
因此,根據您的用例,可能有更清潔的解決方案使用docker 方式的容器!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.