为什么当我使用 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/bash
或 docker 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
我根据以下 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/bash
或 docker 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