我是一个
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 环境。有没有办法在不编辑图像本身的情况下完成这项工作,或者这是否需要重建图像?
提前致谢!
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
。
在为 https://github.com/lehcode/oppendevin(OpenDevin的 Docker 化克隆)进行 docker-compose 配置时遇到了同样的问题。
在 Docker 镜像中的 root 帐户下将 Miniconda 无缝集成到您的环境中的完整解决方案:
conda -V
base
切换到您的
conda activate base
conda env export > conda.base.yml
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 | +-----------------------------------------------------------------------------------------+