nad87563
nad87563

Reputation: 4082

Perl installation issue using Docker

I am trying to build the docker image with perl installation.

Dockerfile:

FROM amazonlinux
WORKDIR /shared
RUN yum -y install gcc
ADD http://www.cpan.org/src/5.0/perl-5.22.1.tar.gz /shared
RUN tar -xzf perl-5.22.1.tar.gz

WORKDIR /shared/perl-5.22.1
RUN ./Configure -des -Dprefix=/opt/perl-5.22.1/localperl

RUN make
RUN make test
RUN make install

all these steps are executed i am can see it executing the make, make test and make install commands but when i do :

docker run -it testsh /bin/bash

Error:

when I check perl -v it says command not found.

and I need to go the perl directory 'cd perl-5.22.1' and run 'make install' again then perl -v works

But I want the perl installation to work when I build it with docker image. can anyone tell me what is going wrong here?

Upvotes: 3

Views: 2569

Answers (2)

antonu17
antonu17

Reputation: 573

At first glance I thought that when you run make install second time, it adds perl's bin directory to PATH env, but when I compared output of env before and after make install it showed the same PATH variable content. The reason you getting perl -v working after make install in running container is that make install puts perl binary to /usr/bin/perl. I don't know why it works such way, but it is just as it is. Also, it's almost useless to store sources inside of your image.

Anyway, I agree with @belwood suggestion about adding your perl's bin directiry to PATH environment variable. I just wanna correct the path: /opt/perl-5.22.1/localperl/bin

You need to add it in your Dockerfile (basically I've rewritten your file to make it produce more efficient image), for example:

FROM amazonlinux

RUN mkdir -p /shared/perl-5.22.1
WORKDIR /shared/perl-5.22.1

RUN yum -y install gcc \
  && curl -SL http://www.cpan.org/src/5.0/perl-5.22.1.tar.gz -o perl-5.22.1.tar.gz \
  && tar --strip-components=1 -xzf perl-5.22.1.tar.gz \
  && rm perl-5.22.1.tar.gz \
  && ./Configure -des -Dprefix=/opt/perl-5.22.1/localperl \
  && make -j $(nproc) \
  && make -j $(nproc) test \
  && make install \
  && rm -fr /shared/perl-5.22.1 /tmp/*

ENV PATH="/opt/perl-5.22.1/localperl/bin:$PATH"
WORKDIR /root

CMD ["perl","-de0"]

When you simply run container with this image, you'll immediately get into perl's shell. If you need bash, then use docker run -it --rm amazon-perl /bin/bash

It would be also good to look at Environment replacement section in the Dockerfile reference documentation, just to figure out how things work. For example, it isn't a best pratice to have that many RUN lines in your Dockerfile because of the RUN instruction will execute commands in a new layer on top of the current image and commit the results. So you'll get many unnecessary layers.

Upvotes: 1

belwood
belwood

Reputation: 3779

perl was indeed installed, just wasn't added to the path. export PATH=$PATH:/shared/perl-5.22.1 should do it -- but of course, you'd want to add a PATH update in the Dockerfile.

Upvotes: 1

Related Questions