我的Dockerfile看起来像
RUN echo "Downloading huge file" && \
wget http://server/huge.tar.gz && \
echo "Extracting huge file" && \
tar xzf huge.tar.gz && \
huge/install /opt/myinstall && \
rm -rf huge*
实际上,我是
Docker构建成功,我可以使用我的新容器。
当我推送到Amazon Container注册表时问题就开始了。
推送被拒绝,因为最后一层很大(约20G)。
20G是一个真正的安装尺寸,所以我可以做一点来减少它。
我的问题是如何将图层拆分为较小的图层以适应亚马逊图层大小限制?
答案 0 :(得分:2)
在每个dockerfile指令上创建一个新层。因此,解决方案是将RUN
命令拆分为多个RUN
命令。但是,如果tar非常大,我不确定这个解决方案是否适用于您的情况,因为其中一个层将包含tar。尽管如此,你应该尝试这种方法。
RUN wget http://server/huge.tar.gz
RUN tar xzf huge.tar.gz
RUN huge/install /opt/myinstall && \
RUN rm -rf huge*
另一种方法是使用docker multistage build。我们的想法是将tar安装在一个单独的容器中,只需将安装目录复制到容器中即可:
FROM ... as installer
RUN echo "Downloading huge file" && \
wget http://server/huge.tar.gz && \
echo "Extracting huge file" && \
tar xzf huge.tar.gz && \
huge/install /opt/myinstall && \
rm -rf huge*
FROM ...
COPY --from=installer /opt/myinstall /opt/myinstall
...
这样,您的图像中只有一个图层只复制安装。
答案 1 :(得分:0)
我有一个相同的问题映像,其层大小> 7GB。 不幸的是,我的大文件是一个二进制文件。
首先,我使用split
命令来制作文件部分:
split -b 1000M huge.bin part_
在Dockerfile
中,将大文件副本替换为:
ADD data/part_aa /data/
ADD data/part_ab /data/
ADD data/part_ac /data/
ADD data/part_ad /data/
ADD data/part_ae /data/
ADD data/part_af /data/
ADD data/part_ag /data/
在entrypoint.sh
的启动脚本中,将以下命令行添加到combine
:
cd /data
MODEL_FILE="huge.bin"
if [ ! -f "$MODEL_FILE" ]; then
echo "combine model file parts, this may take 5 minutes"
cat part_* > $MODEL_FILE
echo "combine model file parts done"
fi
要减少复制和下载的次数,请使用wget
加快速度:
RUN wget -P /data http://192.168.1.111/files/data/part_aa
RUN wget -P /data http://192.168.1.111/files/data/part_ab
RUN wget -P /data http://192.168.1.111/files/data/part_ac
RUN wget -P /data http://192.168.1.111/files/data/part_ad
RUN wget -P /data http://192.168.1.111/files/data/part_ae
RUN wget -P /data http://192.168.1.111/files/data/part_af
RUN wget -P /data http://192.168.1.111/files/data/part_ag
wget
仅缓存网址总和,而文件总和Add
确实