У меня есть образ Docker, который не может найти зависимости Perl при запуске из командной строки, но работает нормально, если я выполняю ту же команду из интерактивной подсказки в образе Docker.
Я запускаю этот образ из командной строки следующим образом:
docker run --rm -v /srv/data:/srv/data wgs_binning -i /srv/data/contigs.fna.gz -c /srv/data/coverage.tsv -o /srv/data/test_binning
Это приводит к следующей проблеме, связанной с зависимостями Perl:
Невозможно найти LWP/Simple.pm в @INC (возможно, вам придется установить LWP::Простой модуль) (@INC содержит: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.36.0 /usr/local/share/perl/5.36.0 /usr/lib/x86_64-linux-gnu/perl5/5.36 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.36 /usr/share/perl/5.36 /usr/local/lib/site_perl) в строке 4 /opt/conda/bin/run_MaxBin.pl. Ошибка BEGIN: компиляция прервана в строке /opt/conda/bin/run_MaxBin.pl. 4.
Я получаю доступ к интерактивному приглашению образа Docker с помощью:
docker run --rm -it -v /srv/data:/srv/data --entrypoint bash wgs_binning
Если я запускаю следующее в интерактивной подсказке, оно выполняется без проблем:
python3 биннинг -i /srv/data/contigs.fna.gz -c /srv/data/coverage.tsv -o /srv/data/test_binning
Точкой входа в мой Dockerfile является ENTRYPOINT ["python3", "binning"]
, поэтому я ожидал, что поведение в этих двух ситуациях будет идентичным.
Есть ли какая-то разница в путях или разрешениях между запуском команды в командной строке и в интерактивной строке?
Программа-нарушитель здесь называется MaxBin
и устанавливается в Dockerfile через mamba
. Не уверен, что это имеет значение, но, возможно, существует взаимодействие между средой conda/mamba, которое различается в двух описанных мной сценариях?
Спасибо, Донован
Полный Dockerfile выглядит следующим образом:
FROM python:3.12.4-slim-bookworm
LABEL description = "Recover MAGs from assembled contigs using UniteM."
LABEL maintainer = "Donovan Parks <[email protected]>"
LABEL version = "0.1.0"
# install additional Linux dependencies
RUN apt-get update -y -m && \
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends --no-install-suggests -y \
wget && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# install Mambaforge
RUN wget --quiet https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-Linux-x86_64.sh -O ~/mambaforge.sh && \
/bin/bash ~/mambaforge.sh -b -p /opt/conda && \
rm ~/mambaforge.sh
# Put mamba in path so we can use mamba commands
ENV PATH = "${PATH}:/opt/conda/bin"
# initialize shell with conda
RUN /opt/conda/bin/conda init bash
# install bioinformatics tools with mamba where available
RUN mamba install -c bioconda \
metabat2=2.15 \
maxbin2=2.2.7 \
&& mamba clean --all
# activate the virtual environment and install dependencies
WORKDIR /wgs_pipeline/dependencies
RUN /opt/conda/bin/pip install --upgrade pip
COPY KBL/requirements.txt requirements.txt
RUN /opt/conda/bin/pip install -r requirements.txt unitem==1.2.6 checkm-genome==1.2.3
# install KBL and WPL libraries
WORKDIR /wgs_pipeline/libraries
COPY wgs_pipeline/wgs_pipeline/wpl/*.py ./wpl/
COPY KBL/kbl/*.py ./kbl/
COPY KBL/kbl/external/*.py ./kbl/external/
# add KBL and WPL libraries to Python path
ENV PYTHONPATH = "/wgs_pipeline"
ENV PYTHONPATH = "/wgs_pipeline/libraries:${PYTHONPATH}"
# copy WGS application script(s)
WORKDIR /wgs_pipeline/apps
COPY wgs_pipeline/wgs_pipeline/apps/binning/*.py ./binning/
ENTRYPOINT ["python3", "binning"]
можешь попробовать с docker run --rm --entrypoint "python" -v /srv/data:/srv/data wgs_binning -c "binning -i /srv/data/contigs.fna.gz -c /srv/data/coverage.tsv -o /srv/data/test_binning"
?
«Проблемной» программой здесь является MaxBin, программа Perl с множеством зависимостей Perl.
Привет @ha36d, запуск docker run --rm --entrypoint "python" -v /srv/data:/srv/data wgs_binning -c "binning -i /srv/data/contigs.fna.gz -c /srv/data/coverage.tsv -o /srv/data/test_binning"
приводит к ошибке NameError: name 'binning' is not defined
.
Привет @DavidMaze, есть ли способ настроить ENTRYPOINT
так, чтобы он запускал оболочку bash
, а затем запускал скрипт Python? Возможно, необходимо запустить оболочку bash, чтобы правильно настроить зависимости Perl? Следующее по-прежнему не позволяет идентифицировать зависимости Perl: docker run --rm -v /srv/data:/srv/data wgs_binning /bin/bash -c "python3 binning -i /srv/data/contigs.fna.gz -c /srv/data/coverage.tsv -o /srv/data/test_binning"
В принципе, вы могли бы установить что-то вроде ENTRYPOINT ["/bin/sh", "-c", "binning \"$@\"", "binning"]
, но это усложняется, и кажется, что это скорее работа над отсутствующей настройкой, чем реальное решение проблемы.
Посмотрите на переменные среды в обоих случаях (возможно, просто запустите perl -V). Могу поспорить, что в рабочем случае есть настройки PERL5LIB, а в нерабочем — нет. Как кто-то уже заметил, интерактивный сеанс использует различные точечные файлы, которые могут устанавливать переменные среды, влияющие на это.
Кроме того, вы можете передать переменные среды процессу внутри докера с помощью --env
или --env-file
.
Спасибо за это. Это не проблема как таковая. Проблема в том, что я устанавливаю программное обеспечение через Conda. Когда я вхожу в образ Docker в интерактивном режиме, он активирует базовую среду Conda, в которой установлена другая версия Perl. Итак, сейчас я просто пытаюсь определить, как активировать базовую среду Conda при внешнем запуске команды.
Решением для моего конкретного случая было изменение ENTRYPOINT на ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "base", "python3", "binning"]
.
Иногда может иметь значение то, запущен ли вообще bash или другая оболочка. Установка на основе
ENTRYPOINT
вообще не запускает оболочку, но запуск интерактивной оболочки может выполнять такие действия, как чтение точечных файлов, которые могут изменять переменные среды. Почти все, что вы показываете в вопросе, связано с Python, за исключением того, что сообщение об ошибке касается Perl; какая часть этой установки использует Perl?