关于从Dockerfile构建小docker映像

关于从Dockerfile构建小docker映像,docker,dockerfile,packages,yocto,Docker,Dockerfile,Packages,Yocto,全部,, 我正在尝试构建一个Docker映像,以便在一个具有OS yocto的嵌入式系统中运行我的python 2应用程序。由于嵌入式系统的闪存有限,我想要一个小的Docker映像。然而,在我安装了所有python和其他软件包之后,我得到了一个730M的映像,这对我来说太大了。我不知道如何压缩图像。请分享你的智慧 谢谢 我的文件如下所示: FROM *****/base-rootfs:yocto-2.1.1 RUN opkg update RUN opkg install *****toolch

全部,, 我正在尝试构建一个Docker映像,以便在一个具有OS yocto的嵌入式系统中运行我的python 2应用程序。由于嵌入式系统的闪存有限,我想要一个小的Docker映像。然而,在我安装了所有python和其他软件包之后,我得到了一个730M的映像,这对我来说太大了。我不知道如何压缩图像。请分享你的智慧

谢谢

我的文件如下所示:

FROM *****/base-rootfs:yocto-2.1.1
RUN opkg update
RUN opkg install *****toolchain
RUN opkg install python-pip
RUN opkg install python-dev
RUN opkg install python
RUN pip install numpy
RUN pip install pandas
RUN pip install scipy
RUN pip install sklearn
COPY appa /opt/app/
RUN chmod 777 /opt/app/main.py
CMD ["python", "./opt/app/main.py"]

Q:如何缩小我的docker图像的大小

A:有几种方法可以做到这一点。从Dockerfile中我能立即发现的最突出的一点是,您正在使用单个
RUN
命令安装软件包

虽然这可以使您的代码看起来更干净一些,但是每个
RUN
语句在大小上都是一个开销,因为docker映像是从
层构建的

对于docker来说,每个
RUN
语句就像是从上一个
层构建一个新的
层,并将其环绕在上一个
层上


我认为,如果您通过将包捆绑到单个安装命令中来减少
层的数量,您应该会看到大小的下降。可以尝试将
pip
一个分组,然后将
opkg
另一个分组。

您可以使用docker history命令查看哪个层增加了更多磁盘空间

docker@default:~Example>> docker history {image-name}:{image-tag}
docker@default:~$ docker history mysql
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
5195076672a7        5 weeks ago         /bin/sh -c #(nop)  CMD ["mysqld"]               0B
<missing>           5 weeks ago         /bin/sh -c #(nop)  EXPOSE 3306/tcp              0B
<missing>           5 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry⦠  0B
<missing>           5 weeks ago         /bin/sh -c ln -s usr/local/bin/docker-entryp⦠  34B
<missing>           5 weeks ago         /bin/sh -c #(nop) COPY file:05922d368ede3042⦠  5.92kB
<missing>           5 weeks ago         /bin/sh -c #(nop)  VOLUME [/var/lib/mysql]      0B
<missing>           5 weeks ago         /bin/sh -c {   echo mysql-community-server m⦠  256MB
<missing>           5 weeks ago         /bin/sh -c echo "deb http://repo.mysql.com/a⦠  56B
<missing>           5 weeks ago         /bin/sh -c #(nop)  ENV MYSQL_VERSION=5.7.21-⦠  0B
<missing>           5 weeks ago         /bin/sh -c #(nop)  ENV MYSQL_MAJOR=5.7          0B
<missing>           5 weeks ago         /bin/sh -c set -ex;  key='A4A9406876FCBD3C45⦠  23kB
<missing>           5 weeks ago         /bin/sh -c apt-get update && apt-get install⦠  44.7MB
<missing>           5 weeks ago         /bin/sh -c mkdir /docker-entrypoint-initdb.d    0B
<missing>           5 weeks ago         /bin/sh -c set -x  && apt-get update && apt-⦠  4.44MB
<missing>           5 weeks ago         /bin/sh -c #(nop)  ENV GOSU_VERSION=1.7         0B
<missing>           5 weeks ago         /bin/sh -c apt-get update && apt-get install⦠  10.2MB
<missing>           5 weeks ago         /bin/sh -c groupadd -r mysql && useradd -r -⦠  329kB
<missing>           5 weeks ago         /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>           5 weeks ago         /bin/sh -c #(nop) ADD file:e3250bb9848f956bd⦠  55.3MB
docker@default:~$
docker@default:~Example>>docker历史记录{image name}:{image tag}
docker@default:~$docker历史mysql
由大小注释创建的图像
5195076672a7 5周前/bin/sh-c#(nop)CMD[“mysqld”]0B
5周前/bin/sh-c#(nop)暴露3306/tcp 0B
5周前/bin/sh-c#(nop)ENTRYPOINT[“docker entry–0B
5周前/bin/sh-cln-susr/local/bin/docker entrypá34B
5周前/bin/sh-c#(nop)复制文件:05922d368ede3042–5.92kB
5周前/bin/sh-c#(nop)卷[/var/lib/mysql]0B
5周前/bin/sh-c{echo mysql社区服务器má256MB
5周前/bin/sh-c echo“debhttp://repo.mysql.com/a-Δ56B
5周前/bin/sh-c#(nop)ENV MYSQL_VERSION=5.7.21-0B
5周前/bin/sh-c#(nop)ENV#u MAJOR=5.70b
5周前/bin/sh-c set-ex;key='A4A9406876FCBD3C45–23kB
5周前/bin/sh-c apt-get-update和apt-get-install–44.7MB
5周前/bin/sh-c mkdir/docker entrypoint initdb.d 0B
5周前/bin/sh-cset-x&&apt-get-update&&apt-4.44MB
5周前/bin/sh-c#(nop)ENV GOSU_版本=1.7 0B
5周前/bin/sh-c apt-get-update和apt-get-install–10.2MB
5周前/bin/sh-c groupadd-r mysql&&useradd-r–329kB
5周前/bin/sh-c#(nop)CMD[“bash”]0B
5周前/bin/sh-c#(nop)添加文件:e3250bb9848f956bdé55.3MB
docker@default:~$

根据输出,您可以查看结果并将结果与这些包的实际大小进行比较,最终深入了解是什么导致了如此巨大的docker映像?

我理解正确;您有一个通过“yocto”创建的基础映像(例如,基于OpenEmbedded的poky发行版)构建,以及相应的包存储库,并基于您想要创建docker映像的实例?是的,我尝试基于“yocto”构建(添加python和相应的包)新映像。谢谢你的回答。我将运行组合在一起,如下所示:运行opkg安装******工具链python开发python pip运行pip安装numpy熊猫scipy sklearn图像大小仍然是730M。我想知道包是否需要占用这么大的空间?我不熟悉
opkg
包管理器和
OS
你正在使用。您可以尝试的另一件事是将
图像旋转为一个容器,然后
docker exec[container_NAME]bash
进入容器。浏览容器并记下可能被删除的文件。将这些可删除文件合并到“清理”中shell脚本并在您的
Dockerfile
中添加一行以运行清理脚本以释放大小。让我知道这是否有助于在
apt
package manager中我们可以执行
apt get clean
以释放高达100mb的空间。只是想知道do
opkg
有类似的内容。我查看了它的文档,但似乎没有o找到任何。如果你对它更熟悉,也许你可以尝试调查一下该区域。谢谢,塞缪尔!让我试试你的建议。今天,我使用“docker slim”压缩图像。它压缩到272MB。但是,当我“docker exec-it conainter_ID bash”时,我不能用opkg安装软件包,我也不知道为什么。我可以用这种方法在未压缩版本中安装软件包,不用担心。我在那里得到的解决方案对你没有什么帮助。无论如何,很高兴知道
docker slim
这对我来说是个新东西。我会看看。730->272真的是一个巨大的收获。