有一篇类似的文章,但这篇文章是关于构建奇点容器的:奇点容器:将自定义包添加到 $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
并忽略本地可执行文件?
对于其他为此苦苦挣扎的人:奇点 exec 将不会运行激活基本 conda 环境的入口点脚本。我解决这个问题的方法是在可执行命令之前调用入口点脚本(建议在 micromamba 基本图像文档中使用 apptainer ):
/usr/local/bin/_entrypoint.sh myexecutable.py -opts