Docker-Compose를 사용하여 Jupyter 노트북을 시작할 때 Docker 컨테이너 내부의 콘다 환경 활성화
Docker-Compose를 사용하여 Jupyter 노트북을 시작할 때 Docker 컨테이너 내부의 콘다 환경 활성화
저는 다음과 같은 것이 있습니다.
FROM continuumio/miniconda3:4.5.11
# create a new user (defaults to 'al-khawarizmi')
USER root
ARG username=al-khawarizmi
RUN useradd --create-home --home-dir /home/${username} ${username}
ENV HOME /home/${username}
# switch to newly created user to avoid running container as root
USER ${username}
WORKDIR $HOME
# build and activate the specified conda environment from a file (defaults to 'environment.yml')
ARG environment=environment.yml
COPY ${environment} .
RUN conda env create --file ${environment} && \
echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
echo "conda activate $(head -1 ${environment} | cut -d' ' -f2)" >> ~/.bashrc
Docker 파일을 사용하면 사용자가 conda 환경 파일을 빌드 인수로 지정할 수 있습니다. 여기에 전형적인 것이 있을 것이다.
name: nessie-py
channels:
- conda-forge
- defaults
dependencies:
- python=3.6
- "notebook=5.7.*"
- "matplotlib=3.0.*"
- "numpy=1.15.*"
- "pandas=0.23.*"
사용자는 표준 방식으로 이미지를 실행할 수 있으며 콘다 환경이 자동으로 활성화됩니다. 입니다.
$ docker run -it image_name:image_tag
콘다 환경이 활성화된 상태에서 Docker 컨테이너 내에서 bash 프롬프트를 생성합니다.
(environment_name)$
이제 컨테이너 내에서 주피터 노트북 서버(주피터를 종속으로 지정하는 콘다 환경 파일로 빌드됨)를 시작하는 데 사용합니다.
다음을 사용할 때
version: "3.7"
services:
notebook-server:
build:
context: ./
ports:
- "8888:8888"
volumes:
- ./:/home/al-khawarizmi
command: jupyter notebook --no-browser ip=0.0.0.0
다음 오류가 발생합니다.
$ docker-compose up
Creating network "nessie-py_default" with the default driver
Creating nessie-py_notebook-server_1 ... done
Attaching to nessie-py_notebook-server_1
notebook-server_1 | [FATAL tini (7)] exec jupyter failed: No such file or directory
nessie-py_notebook-server_1 exited with code 127
나는 이 오류가 콘다 환경이 활성화되지 않았다는 것을 의미한다고 의심했다. 그런 다음 를 실행하기 전에 이 기능이 대화형 bash 프롬프트를 호출해야 한다는 생각을 추가해 보았습니다. 이것은 위와 같은 오류를 초래했다.
노트북을 실행하기 전에 콘다 환경을 명시적으로 활성화하는 스크립트를 정의해 보았습니다.
#!/bin/bash
set -e
# activate the environment and start the notebook
conda activate nessie-py
jupyter notebook --no-browser ip=0.0.0.0
다른 오류를 초래하다
$ docker-compose up
Creating network "nessie-py_default" with the default driver
Creating nessie-py_notebook-server_1 ... done
Attaching to nessie-py_notebook-server_1
notebook-server_1 |
notebook-server_1 | CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
notebook-server_1 | If your shell is Bash or a Bourne variant, enable conda for the current user with
notebook-server_1 |
notebook-server_1 | $ echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc
notebook-server_1 |
notebook-server_1 | or, for all users, enable conda with
notebook-server_1 |
notebook-server_1 | $ sudo ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh
notebook-server_1 |
notebook-server_1 | The options above will permanently enable the 'conda' command, but they do NOT
notebook-server_1 | put conda's base (root) environment on PATH. To do so, run
notebook-server_1 |
notebook-server_1 | $ conda activate
notebook-server_1 |
notebook-server_1 | in your terminal, or to put the base environment on PATH permanently, run
notebook-server_1 |
notebook-server_1 | $ echo "conda activate" >> ~/.bashrc
notebook-server_1 |
notebook-server_1 | Previous to conda 4.4, the recommended way to activate conda was to modify PATH in
notebook-server_1 | your ~/.bashrc file. You should manually remove the line that looks like
notebook-server_1 |
notebook-server_1 | export PATH="/opt/conda/bin:$PATH"
notebook-server_1 |
notebook-server_1 | ^^^ The above line should NO LONGER be in your ~/.bashrc file! ^^^
notebook-server_1 |
notebook-server_1 |
nessie-py_notebook-server_1 exited with code 1
이 오류는 이 스크립트를 실행하기 전에 소싱되지 않음을 나타냅니다.
나는 콘다 환경을 활성화하기 전에 명시적으로 소싱을 시도했다.
#!/bin/bash
set -e
# activate the environment and start the notebook
. /opt/conda/etc/profile.d/conda.sh
conda activate nessie-py
jupyter notebook --no-browser ip=0.0.0.0
그러면 다른 오류가 발생합니다!
$ docker-compose up
Creating network "nessie-py_default" with the default driver
Creating nessie-py_notebook-server_1 ... done
Attaching to nessie-py_notebook-server_1
notebook-server_1 | Could not find conda environment: nessie-py
notebook-server_1 | You can list all discoverable environments with `conda info --envs`.
notebook-server_1 |
nessie-py_notebook-server_1 exited with code 1
컨테이너에서 어떤 콘덴서가 검색 가능한지 실행을 통해 확인할 수 있습니다.
$ docker run -it nessie-py conda info --envs
그것은 환경이 실제로 존재한다고 말한다.
$ docker run -it nessie-py_notebook-server conda info --envs
# conda environments:
#
nessie-py /home/al-khawarizmi/.conda/envs/nessie-py
base * /opt/conda
나는 이 시점에서 생각이 없다. 이것은 가능해야 한다. 는 콘다 환경을 지정하고 주피터 노트북 서버를 시작하는 도커 파일인 파일이 있는 프로젝트의 예입니다.
필요한 추가 복잡성은 Docker 파일에 루트 사용자가 아닌 사용자를 추가하고 기본 콘다 환경을 업데이트하는 대신 새 콘다 환경을 생성하는 것입니다.
이에 따라 을(를) 에 배치하고 을(를) 사용하는 경우 보다 쉬운 방법이 있습니다.
예를 들어 다음과 같습니다.
FROM continuumio/anaconda3
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
COPY ./environment.yml .
RUN conda env create -f environment.yml
SHELL ["conda", "run", "-n", "venv", "/bin/bash", "-c"]
COPY . .
그리고 당신은 이것과 비슷할 수 있다:
version: '3.3'
services:
web:
environment: [.env]
build: ./project
ports:
- 8000:8000
command: conda run --no-capture-output -n venv uvicorn main:app --host 0.0.0.0 --reload
volumes:
- ./project:/usr/src/app
결과는 다음과 같습니다.
에 오타가 있습니다. 대신 오타가 있어야 합니다.
호스트의 폴더를 컨테이너에 바인딩하는 것이 재정의됩니다. 쉽게 변경할 수 있는 것은 하위 디렉터리에 마운트하는 것입니다.
bash를 대화형 모드()에서 실행해야 올바르게 읽을 수 있습니다.
예를 들어, 이러한 점들의 변경 사항은 다음과 같이 반영되었습니다.
version: "3.7"
services:
notebook-server:
build:
context: ./
ports:
- "8888:8888"
volumes:
- ./:/home/al-khawarizmi/hosthome
command: bash -ic 'jupyter notebook --no-browser --ip=0.0.0.0'