singularity exec 无法识别容器 $PATH 中的可执行文件(将 micromamba docker 映像转换为奇异性映像)

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

有一篇类似的文章,但这篇文章是关于构建奇点容器的:奇点容器:将自定义包添加到 $PATH 并将其传递给奇点 exec

我已将 Docker 容器转换为 Singularity。

这是我的 Dockerfile,它将可执行文件添加到

micromamba
图像:

# v2024.1.29
# =================================
FROM mambaorg/micromamba:1.5.6

ARG ENV_NAME

SHELL ["/usr/local/bin/_dockerfile_shell.sh"]

WORKDIR /tmp/

# Data
USER root
RUN mkdir -p /volumes/
RUN mkdir -p /volumes/input
RUN mkdir -p /volumes/output
RUN mkdir -p /volumes/database

# Retrieve VEBA repository
RUN mkdir -p veba/
USER $MAMBA_USER
COPY --chown=$MAMBA_USER:$MAMBA_USER ./install/ veba/install/
COPY --chown=$MAMBA_USER:$MAMBA_USER ./bin/ veba/bin/
COPY --chown=$MAMBA_USER:$MAMBA_USER ./VERSION veba/VERSION
COPY --chown=$MAMBA_USER:$MAMBA_USER ./LICENSE veba/LICENSE

# Install dependencies
RUN micromamba install -y -n base -f veba/install/environments/${ENV_NAME}.yml && \ 
    micromamba clean -a -y -f

# Add environment scripts to environment bin
RUN cp -rf veba/bin/* /opt/conda/bin/ && \
    ln -sf /opt/conda/bin/scripts/*.py /opt/conda/bin/ && \
    ln -sf /opt/conda/bin/scripts/*.r /opt/conda/bin/


ENTRYPOINT ["/usr/local/bin/_entrypoint.sh"]

这是实际的 Docker 镜像: https://hub.docker.com/r/jolespin/veba_binning-prokaryotic/tags

为了构建奇点图像,我运行了以下命令:

singularity pull containers/veba_binning-prokaryotic__1.5.0.sif docker://jolespin/veba_binning-prokaryotic:1.5.0

这是我使用 Docker 镜像运行奇点的脚本:

declare -xr SINGULARITY_MODULE='singularitypro/3.9'

module purge
module load "${SINGULARITY_MODULE}"


# Local directories
VEBA_DATABASE=/expanse/projects/jcl110/db/veba/VDB_v6/
LOCAL_WORKING_DIRECTORY=$(pwd)
LOCAL_WORKING_DIRECTORY=$(realpath -m ${LOCAL_WORKING_DIRECTORY})
LOCAL_DATABASE_DIRECTORY=${VEBA_DATABASE} # /path/to/VEBA_DATABASE/
LOCAL_DATABASE_DIRECTORY=$(realpath -m ${LOCAL_DATABASE_DIRECTORY})

# Container directories
CONTAINER_INPUT_DIRECTORY=/volumes/input/
CONTAINER_OUTPUT_DIRECTORY=/volumes/output/
CONTAINER_DATABASE_DIRECTORY=/volumes/database/

FASTA=${CONTAINER_INPUT_DIRECTORY}/veba_output/assembly/S1/output/scaffolds.fasta
BAM=${CONTAINER_INPUT_DIRECTORY}/veba_output/assembly/S1/output/mapped.sorted.bam
OUTPUT_DIRECTORY=${CONTAINER_OUTPUT_DIRECTORY}/test_output/
NAME="S1"

SINGULARITY_IMAGE="containers/veba_binning-prokaryotic__1.5.0.sif"
singularity exec \
    --bind ${LOCAL_WORKING_DIRECTORY}:${CONTAINER_INPUT_DIRECTORY},${LOCAL_WORKING_DIRECTORY}:${CONTAINER_OUTPUT_DIRECTORY},${LOCAL_DATABASE_DIRECTORY}:${CONTAINER_DATABASE_DIRECTORY} \
    --contain \
     ${SINGULARITY_IMAGE} \
     binning-prokaryotic.py -f ${FASTA} -b ${BAM} -n ${NAME} -o ${OUTPUT_DIRECTORY} --veba_database ${CONTAINER_DATABASE_DIRECTORY} --skip_maxbin2

我得到的错误是这样的:

FATAL:   "binning-prokaryotic.py": executable file not found in $PATH

当我尝试将 PATH 变量设置为

/opt/conda/bin/
时,它出于某种原因尝试附加我的工作目录(工作目录是
/expanse/projects/jcl110/Test/TestVEBA/
):

(base) [jespinoz@exp-15-01 TestVEBA]$ singularity exec -e PATH=/opt/conda/bin/ containers/veba_binning-prokaryotic__1.5.0.sif echo $PATH
FATAL:   could not open image /expanse/projects/jcl110/Test/TestVEBA/PATH=/opt/conda/bin: failed to retrieve path for /expanse/projects/jcl110/Test/TestVEBA/PATH=/opt/conda/bin: lstat /expanse/projects/jcl110/Test/TestVEBA/PATH=: no such file or directory
(base) [jespinoz@exp-15-01 TestVEBA]$ singularity exec -e PATH:/opt/conda/bin/ containers/veba_binning-prokaryotic__1.5.0.sif echo $PATH
FATAL:   could not open image /expanse/projects/jcl110/Test/TestVEBA/PATH:/opt/conda/bin: failed to retrieve path for /expanse/projects/jcl110/Test/TestVEBA/PATH:/opt/conda/bin: lstat /expanse/projects/jcl110/Test/TestVEBA/PATH:: no such file or directory

有人可以帮助我弄清楚如何加载与 Docker 运行相同的环境(即,将

/opt/conda/bin/
添加到
$PATH
)或仅设置我的
PATH=/opt/conda/bin
并忽略本地可执行文件?

docker path environment-variables containers singularity-container
1个回答
0
投票

对于其他为此苦苦挣扎的人:奇点 exec 将不会运行激活基本 conda 环境的入口点脚本。我解决这个问题的方法是在可执行命令之前调用入口点脚本(建议在 micromamba 基本图像文档中使用 apptainer ):

/usr/local/bin/_entrypoint.sh myexecutable.py -opts
© www.soinside.com 2019 - 2024. All rights reserved.