解压缩本地文件并删除Dockerfile镜像构建中的原始文件



我正在尝试解压缩一个文件,并删除Dockerfile映像构建指令中的原始压缩存档。我需要这样做,因为有问题的文件大于Github对大文件大小设置的2GB限制(请参阅此处(。我追求的解决方案是压缩文件(使其处于2GB限制之下(,然后在构建应用程序时解压缩。我知道构建大型图像并计划将外部数据库集成到项目中是不好的做法,但现在没有时间这样做。

我试过各种选择,但都没有成功。

  1. .zip格式压缩文件,并使用apt-get安装unzip,然后使用unzip解压缩文件:
FROM python:3.8-slim
#install unzip
RUN apt-get update && apt-get install unzip
WORKDIR /app
COPY /data/databases/file.db.zip /data/databases
RUN unzip /data/databases/file.db.zip && rm -f /data/databases/file.db.zip
COPY ./ ./

unzip: cannot find or open /data/databases/file.db.zip, /data/databases/file.db.zip.zip or /data/databases/file.db.zip.ZIP.失败了。我不明白这一点,因为我认为COPY向图像中添加了文件。

  1. 根据此建议,我用gzip压缩了大文件,并尝试使用Docker本机ADD命令对其进行解压缩,即:
FROM python:3.8-slim
WORKDIR /app
ADD /data/databases/file.db.gz /data/databases/file.db
COPY ./ ./

虽然编译时没有出错,但它不会解压缩文件,我可以使用docker exec -t -i clean-dash /bin/bash来探索映像目录结构。由于大文件是gzip文件,我的理解是ADD应该解压缩它,即从文档中解压缩。

如何解决这些要求?

ADD仅解压缩本地tar文件,不一定压缩单个文件。它可以将内容打包到tar文件中,即使它只包含一个文件:

ADD ./data/databases/file.tar.gz /data/databases/
(cd data/databases && tar cvzf file.tar.gz file.db)
docker build .

如果您使用第一种方法,则必须在此处使用多阶段构建。问题是,每个RUN命令都会生成一个新的图像层,因此无论RUN命令做出什么更改,生成的图像总是前一层RUN rm a-large-file实际上会产生一个比包含大文件的图像稍大的图像。

BusyBox工具集包括unzip(1(的实现,因此您应该能够将其拆分为一个阶段和一个阶段,前者只对大文件进行解压缩,后者将结果复制到:

FROM busybox AS unpack
WORKDIR /unpack
COPY data/databases/file.db.zip /
RUN unzip /file.db.zip

FROM python:3.8-slim
COPY --from=unpack /unpack/ /data/databases/

就Docker镜像而言,这些方法中的任何一种都将创建一个非常大的层。在过去,我遇到过单层大于1GIB的操作问题,比如docker push在中途挂断。使用多阶段构建方法,如果您要复制多个文件,则可以通过几个COPY步骤将一批文件分解为多个层。(但是,如果它是一个单一的SQLite文件,那么你真的无能为力。(

基于@David Maze的回答,以下内容奏效了,为了完整起见,我将其发布在这里。

#unpacks zipped database
FROM busybox AS unpack
WORKDIR /unpack
COPY data/databases/file.db.zip /
RUN unzip /file.db.zip
FROM python:3.8-slim
COPY --from=unpack /unpack/file.db /
WORKDIR /app
COPY ./ ./
#move the unpacked db and delete the original
RUN mv /file.db ./data/databases && rm -f ./data/databases/file.db.zip

最新更新