Установите модули с perlbrew и cpm - переключатель perlbrew не меняет @INC во время сборки докера - PullRequest
0 голосов
/ 14 июня 2019

Я бы хотел использовать быстрый cpm модуль установки вместо cpanm в моих проектах.

Также я устанавливаю целевую версию perl, используя perlbrew .

Согласно документации cpm -g опция установит модули в текущий @ INC

Как принудительно изменить perlbrew @INC в Dockerfile?

Ниже приведена часть моего Dockerfile

RUN perl -le 'print for @INC' && \
    perlbrew switch perl-5.31.0 && \
    perl -le 'print for @INC' && \
    cpm install -gv CGI && \
    perlbrew list-modules

Когда я собираю Dockerfile, вывод perl -le 'print for @INC' одинаков оба раза:

/etc/perl
/usr/local/lib/x86_64-linux-gnu/perl/5.22.1
/usr/local/share/perl/5.22.1
/usr/lib/x86_64-linux-gnu/perl5/5.22
/usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.22
/usr/share/perl/5.22
/usr/local/lib/site_perl
/usr/lib/x86_64-linux-gnu/perl-base

Но если я сделаю то же самое вручную, результат будет в порядке:

$ docker run -it pavelsr/xxxhub
root@1a34ea34a3fb:/# perl -le 'print for @INC'
/etc/perl
/usr/local/lib/x86_64-linux-gnu/perl/5.22.1
/usr/local/share/perl/5.22.1
/usr/lib/x86_64-linux-gnu/perl5/5.22
/usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.22
/usr/share/perl/5.22
/usr/local/lib/site_perl
/usr/lib/x86_64-linux-gnu/perl-base
.
root@1a34ea34a3fb:/# perlbrew switch perl-5.31.0

A sub-shell is launched with perl-5.31.0 as the activated perl. Run 'exit' to finish it.

root@1a34ea34a3fb:/# perl -le 'print for @INC'
/usr/local/perlbrew/perls/perl-5.31.0/lib/site_perl/5.31.0/x86_64-linux
/usr/local/perlbrew/perls/perl-5.31.0/lib/site_perl/5.31.0
/usr/local/perlbrew/perls/perl-5.31.0/lib/5.31.0/x86_64-linux
/usr/local/perlbrew/perls/perl-5.31.0/lib/5.31.0
root@1a34ea34a3fb:/# cpm install -g CGI
DONE install HTML-Tagset-3.20
DONE install HTML-Parser-3.72
DONE install CGI-4.44
3 distributions installed.
root@1a34ea34a3fb:/# perlbrew list-modules
CGI
HTML::Parser
HTML::Tagset
Perl

1 Ответ

2 голосов
/ 14 июня 2019

Для начала, « Запущена под-оболочка с ... », указывающая на неправильную настройку perlbrew. Вам было предложено добавить в скрипт запуска вашей оболочки следующее:

source "${PERLBREW_ROOT:-$HOME/perl5/perlbrew}"/etc/bashrc

Без этого используется резервный механизм, чтобы попытаться обеспечить желаемую функциональность, но он совершенно бесполезен вне интерактивных оболочек.


Во-вторых, это довольно сомнительное использование perlbrew. Если ваш скрипт Docker работает как задумано, это будет иметь далеко идущие последствия. Это не очень хорошая вещь. Вы можете использовать perlbrew use, но вместо этого вы можете использовать правильную perl сборку напрямую, используя

RUN "${PERLBREW_ROOT:-$HOME/perl5/perlbrew}"/perls/perl-5.31.0/bin/perl -S cpm install -gv CGI

, который должен разрешиться до

RUN /usr/local/perlbrew/perls/perl-5.31.0/bin/perl -S cpm install -gv CGI

для вас.

...