Ошибка: Ввод-вывод:: Канал: не удается выполнить: нет такого файла или каталога

#docker #perl #ubuntu #io #cpan

#docker #perl #ubuntu #io #cpan

Вопрос:

Я новичок в Docker и Perl. Я хочу настроить свое приложение perl, но во время выполнения получаю следующую ошибку:

 Error: IO::Pipe: Cannot exec: No such file or directory
  

Вот мой Dockerfile:

 FROM ubuntu:18.04
RUN apt-get update amp;amp; 
    apt-get upgrade -y amp;amp; 
    apt-get install -y libimage-magick-perl amp;amp; 
    apt install -y make amp;amp; 
    apt install -y gcc amp;amp; 
    apt install -y perl amp;amp; 
    apt install -y cpanminus
   
RUN cpan install YAML
RUN cpan install IPC::Run
    
WORKDIR /opt
COPY . /opt/deploy

ENTRYPOINT ["perl", "/opt/deploy/bin/deploy"]
  

Это файл, в котором я использую модуль IO::Pipe:

 package Deployment::Log::File;

use strict;
use warnings;

use base 'Tie::Handle';

use constant TRUE  => (1 == 1);
use constant FALSE => (0 == 1);

use Fcntl qw(:flock);
use IO::File;
use IO::Pipe;
use Symbol;
use Sys::Hostname;
use Text::ParseWords;
use Time::HiRes;

...
my $class       = shift;  $class = ref($class) if ref($class);
my $destination = shift;
my $layout      = shift;

my $handle;

if ($destination =~ s/^s*|s*//) {
  my @token = map { $class->interpolate($_) } Text::ParseWords::shellwords($destination);

$handle = IO::Pipe->new;
$handle->writer(@token)
  or return undef;
  

Я попытался установить IO::Pipe и IO с помощью cpan и cpanm, но ничего не сработало. Кто-нибудь может мне помочь?

Комментарии:

1. Вероятно, потребуется просмотреть некоторый код.

2. Я полагаю, вы проверили, что /opt / deploy /bin / deploy, /opt и / opt / deploy существуют и имеют правильные разрешения?

3. @TLP Можете ли вы быстро рассказать, как это сделать в среде docker?

4. @TLP Я проверил это, но / opt / deploy / bin / deploy ни в одном каталоге это мой скрипт, который я запускаю

5. Вы не показываете, на что установлен массив токенов. Наиболее вероятно, что ошибка заключается в том, что командная строка, указанная token, не может быть выполнена, поскольку команда не существует

Ответ №1:

$token[0] ожидается, что он будет содержать имя программы для запуска. Это может быть либо путь, либо простое имя файла (которое ядро преобразует в путь, используя PATH переменную env).

Либо вы указали простое имя файла, и исполняемый файл с таким именем не найден ни в каких каталогах, указанных в PATH env var, либо вы указали путь к несуществующему файлу.

Возможно, программа делает неверные предположения о своем текущем рабочем каталоге?