본문 바로가기

개발하자

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



결과는 다음과 같습니다.

  1. 에 오타가 있습니다. 대신 오타가 있어야 합니다.

  2. 호스트의 폴더를 컨테이너에 바인딩하는 것이 재정의됩니다. 쉽게 변경할 수 있는 것은 하위 디렉터리에 마운트하는 것입니다.

  3. 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'

반응형