我正在尝试使用perl安装来构建docker镜像。
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
执行所有这些步骤我可以看到它执行make,make test和make install命令,但是当我这样做时:
docker run -it testsh /bin/bash
错误:
当我检查perl -v时,表示找不到命令。
我需要去perl目录 'cd perl-5.22.1'再次运行'make install'然后perl -v工作
但是当我使用docker image构建它时,我希望perl安装正常工作。谁能告诉我这里出了什么问题?
答案 0 :(得分:1)
答案 1 :(得分:1)
乍一看,我认为当你第二次运行make install
时,它会将perl的bin目录添加到PATH env中,但当我比较env
之前和之后make install
的输出时它显示了相同的PATH
变量内容。
您在perl -v
运行容器后make install
工作的原因是make install
将perl
二进制文件放入/ usr / bin / perl。我不知道它为什么会这样运作,但它就是这样。此外,在图像中存储信息源几乎没用。
无论如何,我同意 @belwood 关于将perl的bin方法添加到PATH
环境变量的建议。我只想纠正这条道路:/opt/perl-5.22.1/localperl/bin
您需要在Dockerfile
中添加它(基本上我已经重写了您的文件以使其生成更高效的图像),例如:
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"]
当您只使用此图片运行容器时,您将立即进入perl的shell。如果您需要bash,请使用docker run -it --rm amazon-perl /bin/bash
查看 Dockerfile参考文档中的Environment replacement部分也是一件好事,只是为了弄清楚工作原理。例如,RUN
由于Dockerfile
指令而在RUN
中包含那么多load
行,将在当前图像顶部的新图层中执行命令并提交结果。因此,您将获得许多不必要的图层。