laravel - 减少 Laravel 5.8 的 Docker 镜像大小
问题描述
我需要减少我的 Laravel 5.8 项目的 Docker 映像大小。
我现在有这个
FROM composer:latest
COPY . /src
ADD .env.example /src/.env
WORKDIR /src
RUN composer install
RUN php artisan key:generate
RUN chmod -R 777 storage/
CMD php artisan serve --host=0.0.0.0
docker-compose.yml
version: '3'
services:
johnywalker5g:
container_name: johnywalker5g
build:
context: .
dockerfile: Dockerfile
ports:
- 8000:8000
首先我跑了docker-compose up
。我的网站正在运行。
然后,我运行了我看到的 docker images
docker images
我懂了
REPOSITORY TAG IMAGE ID CREATED SIZE
johnywalker5g latest c404551006c7 About an hour ago 193MB
composer latest 520372566db9 2 weeks ago 157MB
尺码有点大193MB
+157MB
docker history c404551006c7
520372566db9 2 weeks ago /bin/sh -c #(nop) CMD ["composer"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["/bin/sh" "/d… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) WORKDIR /app 0B
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:098af1c9d6ed00c2… 1.13kB
<missing> 2 weeks ago /bin/sh -c curl --silent --fail --location -… 1.91MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV COMPOSER_VERSION=1.8.4 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV COMPOSER_HOME=/tmp 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV COMPOSER_ALLOW_SUPERU… 0B
<missing> 2 weeks ago /bin/sh -c apk add --no-cache --virtual .bui… 1.83MB
<missing> 2 weeks ago /bin/sh -c echo "memory_limit=-1" > "$PHP_IN… 34B
<missing> 2 weeks ago /bin/sh -c apk --no-cache add --virtual .com… 75.5MB
<missing> 2 weeks ago /bin/sh -c #(nop) CMD ["php" "-a"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["docker-php-e… 0B
<missing> 2 weeks ago /bin/sh -c docker-php-ext-enable sodium 167kB
<missing> 2 weeks ago /bin/sh -c #(nop) COPY multi:03970f7b3773444… 6.45kB
<missing> 2 weeks ago /bin/sh -c set -xe && apk add --no-cache --… 58MB
<missing> 2 weeks ago /bin/sh -c #(nop) COPY file:ce57c04b70896f77… 587B
<missing> 2 weeks ago /bin/sh -c set -xe; apk add --no-cache --v… 12MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_SHA256=6bb03e79a1… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_URL=https://secur… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_VERSION=7.3.3 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV GPG_KEYS=CBAF69F173A0… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_LDFLAGS=-Wl,-O1 -… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_CPPFLAGS=-fstack-… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_CFLAGS=-fstack-pr… 0B
<missing> 2 weeks ago /bin/sh -c set -eux; mkdir -p "$PHP_INI_DIR… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHP_INI_DIR=/usr/loca… 0B
<missing> 2 weeks ago /bin/sh -c set -x && addgroup -g 82 -S www-… 4.85kB
<missing> 2 weeks ago /bin/sh -c apk add --no-cache ca-certifica… 2.71MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV PHPIZE_DEPS=autoconf … 0B
<missing> 2 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ADD file:38bc6b51693b13d84… 4.41MB
人们将如何进行并进一步减小它的大小?
解决方案
您的 docker 图像的图层被放置在compose docker 图像的图层之上,这些图层的总和为157MB
. 您的图像是193MB
,您唯一可以减少的是您在合成图像顶部添加的36MB
( )。看看能挤什么。193 - 157
COPY . /src
COPY . /src
会将工作目录的所有内容放到容器/src
目录中。这可能比你想要的更多。限制将内容复制到容器的一种方法是使用.dockerignore文件(这是关于该主题的精彩文章)。
这样的文件通常具有类似于以下内容的内容:
.dockerignore
.git
.gitignore
README.md
Changelog.md
Dockerfile
docker-compose.yml
docs
在某些项目上,该.git
目录可能非常大。如果您还有一个包含数据库转储或 docker 映像中不需要的其他大文件的目录,请确保将它们添加到.dockerignore
文件中。
RUN composer install
RUN composer install
还将安装映像中不需要的开发依赖项。将其更改为
RUN composer install --no-dev
走得更远,这个SO answer sugests to use
RUN composer install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader
.
潜入你的形象
使用潜水来探索每个图像层,并确定是否在某些时候添加了不必要的文件。
利用 Docker 多阶段构建
如果 composer 仅对下载和安装 PHP 库有用,那么一旦下载并安装了这些库,您可能想要摆脱 composer。这不能从经典的 Dockerfile 中完成,因为每个RUN
/COPY
或ADD
指令都会在前一个之上生成一个新层。
因此,假设您有一个包含 100MB 文件的层,如果您稍后在同一个 Dockerfile 中删除该文件,则删除将在新层中发生。具有 100MB 的前一层仍然存在于您的层三明治中。
docker让我们与之抗争的一种方式是多阶段构建Dockerfile。
然后,您的 Dockerfile 可以按以下方式构建(未经测试):
FROM composer:latest as build_stage
COPY . /src
ADD .env.example /src/.env
WORKDIR /src
RUN composer install
RUN php artisan key:generate
FROM php:7-fpm-alpine
COPY --from=build_stage /src /var/www/html
RUN mkdir /var/www/html/storage/ \
&& chmod -R 777 /var/www/html/storage/
警告: 这只是 Dockerfile 的主要结构,您可能需要对其进行更多调整以添加缺少的 php 扩展。参考官方 php docker image guide。
推荐阅读
- python - 使用 BioPython 时,函数不会遍历整个列表
- azure - 在 Azure DevOps 中将依赖项复制到私有源
- node.js - Nodejs Puppeteer 没有启动
- node.js - NodeJS Loop 也不在等待 .then
- wpf - 如何使 WPF ListBox 中的项目水平和垂直换行
- javascript - 一次只显示数据库中的一项并循环显示其他项目
- repository - jfrog 工件“对象键:值对后的无效字符'”'
- typescript - 将 Typescript 升级到 3.8.2 后出现约束错误
- json - Hive json serde 选择
- html - 如何在没有背景图像的图像标签中制作视差效果?