Проведя небольшое исследование, я пришел к выводу, что установка SSH-сервера внутри моего контейнера и вход через удаленный интерпретатор PyCharm SSH - это лучшее, что нужно сделать, несмотря на опасения, высказанные в других местах. Мне удалось это следующим образом.
Приведенный ниже Dockerfile создаст образ с SSH-сервером внутри, в который вы можете войти по SSH. У него также есть anaconda / python, так что есть возможность запустить сервер ноутбука внутри и подключиться к нему обычным способом для Jubyter. Обратите внимание, что у него есть простой текстовый пароль (screencast), вы обязательно должны включить регистрацию с помощью ключа, если вы используете это для чего-то важного.
Он возьмет локальные библиотеки и установит их в вашу библиотеку пакетов внутри контейнера, и при желании вы также можете извлекать репозитории из GitHub (зарегистрируйтесь для получения ключа API в GitHub, если вы хотите это сделать, поэтому вам не нужно введите простой текстовый пароль). Также требуется, чтобы вы создали открытый текст requirements.txt
, содержащий все другие пакеты, которые вам нужно будет установить в pip.
Затем выполните команду build, чтобы создать образ, и выполните команду, чтобы создать контейнер из этого образа. В Dockerfile мы выставляем SSH через порт контейнера 22, поэтому давайте подключим его к неиспользуемому порту в экземпляре AWS - через этот порт мы будем проходить через SSH. Также добавьте еще одну пару портов, если вы хотите использовать Jupyter с локального компьютера в любой момент:
docker build -t your_image_name .
не пропустите .
в конце - это важно!
docker run -d -p 5001:22 -p8889:8889 --name=your_container_name your_image_name
Nb. вам нужно будет прорваться в контейнер (docker exec -it xxxxxxxxxx bash
) и включить Jupyter с помощью jupyter notebook
.
Dockerfile:
ROM python:3.6
RUN apt-get update && apt-get install -y openssh-server
# Load an ssh server. Change root username and password. By default in debian, password login is prohibited,
# go into the file that controls this and make a change to allow password login
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN /etc/init.d/ssh restart
# Install git, so we can pull in some repos
RUN apt-get update && apt-get upgrade -y && apt-get install -y git
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
# Install the requirements and the libraries we need (from a requirements.txt file)
COPY requirements.txt /tmp/
RUN python3 -m pip install -r /tmp/requirements.txt
# These are local libraries, add them (assuming a setup.py)
ADD your_libs_directory /your_libs_directory
RUN python3 -m pip install /your_libs_directory
RUN python3 your_libs_directory/setup.py install
# Adding git repos (optional - assuming a setup.py)
git clone https://git_user_name:git_API_token@github.com/YourGit/git_repo.git
RUN python3 -m pip install /git_repo
RUN python3 git_repo/setup.py install
# Cleanup
RUN apt-get update && apt-get upgrade -y && apt-get autoremove -y
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]