减少Laravel 5.8的Docker映像大小

时间:2019-03-27 20:46:21

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

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

doccker-compose.yml

version: '3'
services:
  johnywalker5g:
    container_name: johnywalker5g
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8000:8000

首先,我运行了docker-compose up。我的网站正在运行。

然后,我运行了我看到的docker映像

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              

人们将如何做并进一步缩小其规模?

1 个答案:

答案 0 :(得分:2)

您的docker映像的图层位于 compose docker映像的图层之上,该图层总计为157MB。您的图片为193MB,唯一可以减少的是来自您在 compose 图片上方添​​加的36MB193 - 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,答案很容易使用

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的上一层仍保留在您的层三明治中。

码头工人带给我们战斗的一种方法是multistage build码头工人文件。

您的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