为什么当我使用 ssh 或 exec/attach 连接到我的 Docker 容器时 PATH 不同?

Why does PATH differ when I connect to my Docker container with ssh or with exec/attach?

我根据以下 Docker 文件构建了一个 Docker 图像:

ARG PYTORCH="1.6.0"
ARG CUDA="10.1"
ARG CUDNN="7"

FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel

ENV TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0+PTX"
ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all"
ENV CMAKE_PREFIX_PATH="$(dirname $(which conda))/../"

# SSH SERVER
RUN apt-get update && apt-get install openssh-server sudo -y
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
RUN echo 'root:root' | chpasswd

WORKDIR /

EXPOSE 22
CMD ["service ssh start"]

我用

启动 Docker 容器
docker run -it -d -p 7220:22 --name ssh-server-test ssh-server-image /bin/bash

如果我使用 docker exec -it ssh-server-test /bin/bashdocker attach ssh-server-test 连接到容器,我会得到我期望的 PATH

root@9264667daf83:/# echo $PATH
/opt/conda/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

但是,如果我用

启动ssh服务器
root@9264667daf83:/# service ssh start
 * Starting OpenBSD Secure Shell server sshd                                                                                                                                [ OK ] 
root@9264667daf83:/# 

而我以root身份通过ssh连接到Docker容器,那么PATH就完全不同了!

root@9264667daf83:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

为什么?当我通过 ssh 连接到容器时,如何获得正确的 PATH 变量?

您要求的环境变量已由 docker 本身使用 ENV 子句设置。检查初始 Dockerfile 的 source code

ENV 设置的变量存在于构建阶段,运行,以及当您执行到 运行ning 容器时。更多 here.

但是,当您通过 SSH 进入容器时,通常的 Linux 源文件路径(如 ~/.bashrc )可以正常工作。但是这些文件中没有PATH with conda, nvidia等

作为解决方法,您可以在构建阶段使用相应的 export PATH 修补 /root/.bashrc。例如,您可以添加到 Dockerfile

RUN echo 'export PATH=/opt/conda/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:$PATH' >> /root/.bashrc

UPD

如果你想使用与构建阶段完全相同的PATH,你可以使用

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