如何使用 Docker 容器启动 Conda 环境

问题描述 投票:0回答:2

我是一个

docker
新手,所以如果这是一个愚蠢的问题,我深表歉意。

作为背景,我使用的是一个无法编辑或更改的 Docker 映像。我使用

docker run [various-args] [image-name]
运行容器,并且容器已启动。如果我随后运行
docker exec -it [ID] bash
,我可以从容器内部获取一个 shell,并且它成功执行我所有 python 代码所需的
conda
环境,因此我只需运行
python script.py
并且一切都运行正常。

我想自动化此过程以供将来使用,因此我想将这些命令放入单个脚本中,这样我就不需要在环境中手动键入或执行任何内容。我认为可行的解决方案是这样的:

docker exec -it [ID] bash -c "python script.py"

但这不起作用,会给 python 代码带来导入错误。我的假设是conda环境没有激活,所以我尝试执行

conda activate my-env
,这会引发一个新错误:

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.

因此,我按照说明首先运行

conda init bash
看看是否有帮助,但此错误最终仍然会出现。最终,似乎如果我先执行 bash shell,然后手动开始运行 python 代码,一切都很好,但如果我尝试一次完成所有操作,则由于某些原因无法设置 conda 环境。有没有办法在不编辑图像本身的情况下完成这项工作,或者这是否需要重建图像?

提前致谢!

python docker shell conda environment
2个回答
1
投票

conda activate
函数由
.bashrc
命令添加到
conda init
的代码定义。除非使用
.bashrc
(
-l
) 标志,否则 Bash 不会源
--login

但是,Conda 并没有打扰 shell,而是提供了一个在指定环境中执行的

conda run
命令。所以,尝试类似的事情

docker exec -it [ID] conda run -n my-env python script.py

对于交互式脚本,可能还需要一些额外的

conda run
标志,例如
--live-stream
--no-capture-output
。请参阅
conda run -h


0
投票

在为 https://github.com/lehcode/oppendevinOpenDevin的 Docker 化克隆)进行 docker-compose 配置时遇到了同样的问题。

在 Docker 镜像中的 root 帐户下将 Miniconda 无缝集成到您的环境中的完整解决方案:

  1. 在主机上安装Miniconda。你可能之前就这样做过💻。检查
    conda -V
  2. 使用
    base
     切换到您的 
    conda activate base
  3. 环境
  4. 奔跑
    conda env export > conda.base.yml
  5. 在您的
    Dockerfile
    中使用以下代码片段:
FROM ...

ADD --checksum=sha256:b978856ec3c826eb495b60e3fffe621f670c101150ebcbdeede4f961f22dc438 https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh /tmp/miniconda.sh

COPY conda.base.yml environment.yml

ARG conda_dir
ENV CONDA_PREFIX=$conda_dir

ENV PATH="${PATH}:/root/.local/bin:${CONDA_PREFIX}/bin"
ENV TZ="$timezone"
ENV VENV_NAME="$venv_name"

RUN if [ -n "${DEBUG}" ]; then set -eux; fi && \
    mkdir -p "${CONDA_PREFIX}" && \
    /bin/bash /tmp/miniconda.sh -b -u -p ${CONDA_PREFIX}

ARG conda_pkgs_dir=$CONDA_PREFIX/pkgs

RUN --mount=type=cache,target=${conda_pkgs_dir},sharing=locked \
    if [ -n "${DEBUG}" ]; then set -eux; fi && \
    conda config --set channel_priority disabled && \
    conda install -qy pip && \
    conda init -q bash && \
    conda env create -y -f environment.yml -n "${VENV_NAME}"

RUN --mount=type=cache,target=${conda_pkgs_dir},sharing=locked \
    if [ -n "${DEBUG}" ]; then set -eux; fi && \
    conda install -n "${VENV_NAME}" pip && \
    conda run -n ${VENV_NAME} pip install --upgrade pip && \
    conda install -n "${VENV_NAME}" pytorch::pytorch==2.2.2

# Activate Miniconda environment
RUN eval "$(conda shell.bash activate "${VENV_NAME}")"
# Make RUN commands use the new environment
SHELL ["conda", "run", "-n", "od_env", "/bin/bash", "-c"]

ENV APP_DIR="$app_dir"

WORKDIR ${APP_DIR}
COPY requirements.txt .

RUN --mount=type=cache,target=${pip_cache_dir},sharing=locked \
    if [ ! -z "${DEBUG}" ]; then set -eux; fi && \
    pip install -r requirements.txt && \
    pip install uvicorn jupyter notebook

RUN if [ ! -z "${DEBUG}" ]; then set -eux; fi && \
    pip freeze --local --all -r "$APP_DIR/requirements.txt"

# Revert shell to regular BASH
SHELL ["/usr/bin/env bash", "--login", "-c"]

entrypoint.sh
中调试:

#!/bin/bash
echo "Container hostname: $(hostname)"
echo "Container IP: $(hostname -i)"
echo "Environment variables:"
env | grep NVIDIA
echo "Python environment and executables status:"
python3 --version
echo "Python executable: $(which python3)/$(python3 --version)"
echo "PIP executable: $(which pip)/$(pip --version)"
echo "Python executable in ${VENV_NAME}: $(conda run -n ${VENV_NAME} python3 --version)"
echo "Python executable in ${VENV_NAME}: $(conda run -n ${VENV_NAME} pip --version)"
echo "Conda environments info:"
conda info --envs
echo "Nvidia CUDA properties:"
nvidia-smi

输出:

Python environment and executables status:
devin-app  | Python 3.12.1
devin-app  | Python executable: /opt/opendevin/.conda/bin/python3/Python 3.12.1
devin-app  | PIP executable: /opt/opendevin/.conda/bin/pip/pip 23.3.1 from /opt/opendevin/.conda/lib/python3.12/site-packages/pip (python 3.12)
devin-app  | Python executable in od_env: Python 3.11.8
devin-app  | Python executable in od_env: pip 24.0 from /opt/opendevin/.conda/envs/od_env/lib/python3.11/site-packages/pip (python 3.11)
devin-app  | Conda environments info:
devin-app  | # conda environments:
devin-app  | #
devin-app  | base                  *  /opt/opendevin/.conda
devin-app  | od_env                   /opt/opendevin/.conda/envs/od_env
devin-app  |
devin-app  | Nvidia CUDA properties:
devin-app  | Wed Apr 10 16:44:28 2024
devin-app  | +-----------------------------------------------------------------------------------------+
devin-app  | | NVIDIA-SMI 550.65                 Driver Version: 551.86         CUDA Version: 12.4     |
devin-app  | |-----------------------------------------+------------------------+----------------------+
devin-app  | | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
devin-app  | | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
devin-app  | |                                         |                        |               MIG M. |
devin-app  | |=========================================+========================+======================|
devin-app  | |   0  NVIDIA GeForce RTX 3080        On  |   00000000:26:00.0  On |                  N/A |
devin-app  | |  0%   49C    P8             35W /  340W |    3394MiB /  10240MiB |      4%      Default |
devin-app  | |                                         |                        |                  N/A |
devin-app  | +-----------------------------------------+------------------------+----------------------+
devin-app  |
devin-app  | +-----------------------------------------------------------------------------------------+
devin-app  | | Processes:                                                                              |
devin-app  | |  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
devin-app  | |        ID   ID                                                               Usage      |
devin-app  | |=========================================================================================|
devin-app  | |    0   N/A  N/A        37      G   /Xwayland                                   N/A      |
devin-app  | +-----------------------------------------------------------------------------------------+
© www.soinside.com 2019 - 2024. All rights reserved.