【问题标题】:Reduce Docker image size of Laravel 5.8减少 Laravel 5.8 的 Docker 镜像大小
【发布时间】:2019-08-18 13:11:10
【问题描述】:

我需要减小我的 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              

如何进一步减小它的大小?

【问题讨论】:

  • 最终图像johnywalker5g 的大小只有 193MB,而不是 193MB+157MB。但无论如何,我不认为你可以进一步缩小它,因为你的composer 基本映像已经使用php:7-alpine3.8 作为基本映像,这是较小的 PHP 映像之一。此外,大小就是您在磁盘上看到的大小 - 如果将映像推送到 Docker Hub,则仅推送与 composer 映像相比的新层(大小约为 36MB)。
  • 你能发布docker history c404551006c7的结果吗?还有/storage的目的是什么?不应该是一卷吗?
  • @Namoshek 你是说我现在拥有的东西还不错吗?
  • @Thomasleveil 我将更新我的帖子以包含该内容
  • 来自docker history 输出,看来c404551006c7 不是您发布的Dockerfile 生成的实际图像。仔细检查

标签: laravel docker docker-compose dockerfile laravel-5.8


【解决方案1】:

你的 docker 镜像的层被放置在 compose docker 镜像的层之上,总和为157MB。您的图像是193MB,您唯一可以减少的就是您在compose 图像之上添加的36MB (193 - 157)。看看能挤什么。

COPY . /src

COPY . /src 会将你工作目录的所有内容放到容器/src 目录下。这可能比你想要的更多。限制将内容复制到容器的一种方法是使用 .dockerignore 文件(here 是关于该主题的一篇很棒的文章)。

此类文件的内容通常类似于:

.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

走得更远this SO answer sugests to use

RUN composer install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader.


深入了解您的形象

使用dive 浏览您的每个图像层,并确定是否在某些时候添加了不必要的文件。


利用 Docker 多阶段构建

如果 composer 只对下载和安装你的 PHP 库有用,那么一旦这些库下载并安装,你可能想要摆脱 composer。这不能从经典的 Dockerfile 完成,因为每一个 RUN/COPYADD 指令都会在前一个之上生成一个新层。

假设您有一个包含 100MB 文件的层,如果您稍后在同一个 Dockerfile 中删除该文件,则删除将在新层中发生。具有 100MB 的前一层仍然存在于您的层夹层中。

docker 让我们参与其中的一种方式是 multistage build 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 扩展。参考official php docker image guide

【讨论】:

  • 另外,您是否建议我开始研究alpine 或其他可能小于157 MB 的东西?
  • 我没有,official composer image 可能已经过优化。同意它可能有一些您的图像不需要的 PHP 扩展,但是您必须投入时间来构建自己的图像(并维护它)很可能不值得您节省假设的 40MB。
  • 我已经用 multistage build 更新了我的答案,这可能是要走的路。 php:7-fpm-alpine 只是 79MBcomposer:latest154MB
  • 它将是79MB(来自php:7-fpm-alpine 层)+ 层的大小
  • 我建议您使用 dive 工具来探索每一层,并更好地了解 Dockerfile 中的每个指令如何影响层。不要忘记您需要 PHP 二进制文件、PHP 扩展、您的 php 文件和资产以及最终图像中的 Web 服务器。并非所有内容都可以轻松删除。
猜你喜欢
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
相关资源
最近更新 更多