Поведение Docker в командной строке отличается от интерактивного приглашения

У меня есть образ 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"]

Иногда может иметь значение то, запущен ли вообще bash или другая оболочка. Установка на основе ENTRYPOINT вообще не запускает оболочку, но запуск интерактивной оболочки может выполнять такие действия, как чтение точечных файлов, которые могут изменять переменные среды. Почти все, что вы показываете в вопросе, связано с Python, за исключением того, что сообщение об ошибке касается Perl; какая часть этой установки использует Perl?

David Maze 27.06.2024 20:24

можешь попробовать с 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"?

ha36d 27.06.2024 20:24

«Проблемной» программой здесь является MaxBin, программа Perl с множеством зависимостей Perl.

DHP 27.06.2024 20:43

Привет @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.

DHP 27.06.2024 20:48

Привет @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"

DHP 27.06.2024 20:54

В принципе, вы могли бы установить что-то вроде ENTRYPOINT ["/bin/sh", "-c", "binning \"$@\"", "binning"], но это усложняется, и кажется, что это скорее работа над отсутствующей настройкой, чем реальное решение проблемы.

David Maze 27.06.2024 22:07
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
2
6
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Посмотрите на переменные среды в обоих случаях (возможно, просто запустите perl -V). Могу поспорить, что в рабочем случае есть настройки PERL5LIB, а в нерабочем — нет. Как кто-то уже заметил, интерактивный сеанс использует различные точечные файлы, которые могут устанавливать переменные среды, влияющие на это.

Кроме того, вы можете передать переменные среды процессу внутри докера с помощью --env или --env-file.

Спасибо за это. Это не проблема как таковая. Проблема в том, что я устанавливаю программное обеспечение через Conda. Когда я вхожу в образ Docker в интерактивном режиме, он активирует базовую среду Conda, в которой установлена ​​другая версия Perl. Итак, сейчас я просто пытаюсь определить, как активировать базовую среду Conda при внешнем запуске команды.

DHP 01.07.2024 23:59

Решением для моего конкретного случая было изменение ENTRYPOINT на ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "base", "python3", "binning"].

DHP 02.07.2024 00:07

Другие вопросы по теме