代码之家  ›  专栏  ›  技术社区  ›  davidrpugh

使用Docker compose启动Jupyter笔记本时,在Docker容器内激活conda env

  •  0
  • davidrpugh  · 技术社区  · 7 年前

    Dockerfile .

    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
    

    environment.yml file .

    name: nessie-py
    
    channels:
      - conda-forge
      - defaults
    
    dependencies:
      - python=3.6
      - "notebook=5.7.*"
      - "matplotlib=3.0.*"
      - "numpy=1.15.*"
      - "pandas=0.23.*"
    

    用户可以标准方式运行图像,conda环境将自动激活。跑步

    $ docker run -it image_name:image_tag
    

    在激活conda环境的Docker容器中生成bash提示符。

    (environment_name)$
    

    现在我想用 docker-compose 在容器内启动Jupyter笔记本服务器(使用指定Jupyter为依赖项的conda环境文件构建)。

    当我使用下面的 docker-compose.yml

    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
    

    我怀疑这个错误意味着康达环境没有被激活。然后我尝试添加 tty: true stdin_open: true docker-compose.yml 认为在运行 command

    我还尝试定义一个 start-notebook.sh

    #!/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
    

    bash 这不是采购 ~/.bashrc 在运行脚本之前。

    我试着明确地寻找资源 /opt/conda/etc/profile.d/conda.sh 在激活conda环境之前。

    #!/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
    

    我可以通过运行来检查容器中可发现哪些conda环境

    $ 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
    

    我现在没有主意了。这应该是可能的。 Here 是一个具有 docker-compose.yml 文件,指定conda环境并启动Jupyter笔记本服务器的Dockerfile。

    我需要的额外复杂性包括向Dockerfile添加一个非root用户,以及创建一个新的conda环境,而不是更新默认值 base

    1 回复  |  直到 7 年前
        1
  •  1
  •   fernandezcuesta    7 年前

    结果是:

    1. docker-compose.yml ip=0.0.0.0 应该是哪一个 --ip=0.0.0.0

    2. 正在覆盖将主机文件夹绑定到容器中 .bashrc . 一个简单的改变是装入一个子目录

    3. -i )所以 巴什尔先生 正确阅读

    docker-compose.yml :

    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'