我正在按照these的说明从docker
构建python3.7
的图像,其中也包含ruby
-我特别需要2.1.5
(不要问)
所以我的Dockerfile
是这样的:
FROM python:3.7
SHELL ["/bin/bash", "-c"]
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
curl \
dirmngr \
gnupg2 \
&& curl -sSL https://rvm.io/mpapis.asc | gpg2 --import - \
&& gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB \
&& curl -sSL https://get.rvm.io | bash -s stable \
&& usermod -a -G rvm root \
&& source /etc/profile.d/rvm.sh \
&& rvm install ruby-2.1.5
构建成功完成,但是最终映像的路径中没有ruby
,这是此命令source /etc/profile.d/rvm.sh
实际上在构建期间没有任何作用的结果。
当我在容器中运行cmd并运行它时,ruby
可用。
那是为什么?
答案 0 :(得分:0)
请参见this:
RUN指令将在当前图像顶部的新层中执行所有命令,并提交结果。
因此,RUN
中的所有Dockerfile
只会影响映像生成,而不影响容器。您应将任何source
放在entrypoint
或cmd
中。或在Dockerfile中建立符号链接以将其链接到/bin/
。
答案 1 :(得分:0)
如果您在仅针对该命令存在的shell中提供脚本,则该脚本不会对以后的任何命令产生任何持久影响。
尝试一下:
RUN /bin/bash -c "source /etc/profile.d/rvm.sh; command1; command2; command3;"