#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. Я обновил свой ответ.