Почему ПУТЬ отличается, когда я подключаюсь к своему контейнеру Docker с помощью ssh или с помощью exec/attach?

#docker #ssh #server #pytorch #environment-variables

Вопрос:

Я создаю образ докера на основе следующего файла докера:

 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 amp;amp; 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:/# 
 

и я подключаюсь к контейнеру Docker через ssh как root, тогда PATH все совершенно по-другому!

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

Почему? И как я могу получить правильную PATH переменную также при подключении к контейнеру через ssh?

Ответ №1:

Переменная среды, о которой вы спрашиваете, была задана самим докером с помощью ENV предложения. Проверьте исходный код исходного файла Dockerfile.

Переменные, которые задаются, ENV существуют на этапе сборки, запуска и при запуске в работающий контейнер. Подробнее здесь.

Но когда вы подключаетесь по SSH к контейнеру, обычный путь Linux для поиска подобных файлов ~/.bashrc работает. Но PATH в этих файлах нет данных с conda, nvidia и т. Д.

В качестве обходного пути вы можете исправить /root/.bashrc на этапе сборки с помощью соответствующего export PATH . Например, вы можете добавить в 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
 

Комментарии:

1. @DeltaIV обновлено.

2. Вы можете использовать двойные кавычки, например, RUN echo "export PATH=${PATH}" >> /root/.bashrc чтобы получить значение ПУТИ из среды на этапе сборки.

3. Я обновил свой ответ.