Уменьшить размер изображения Docker Laravel 5.8 - PullRequest
2 голосов
/ 27 марта 2019

Мне нужно уменьшить размер изображения Docker моего проекта Laravel 5.8.

У меня есть это прямо сейчас

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 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 Ответ

2 голосов
/ 28 марта 2019

Слои изображения вашего докера располагаются поверх compose слоев изображения докера, которые в сумме составляют 157MB. Ваше изображение 193MB, единственное, что вы можете уменьшить, это 36MB (193 - 157), который вы добавляете поверх compose изображения. Давай посмотрим, что можно выжать.

COPY . /src

COPY . /src поместит все содержимое вашего рабочего каталога в каталог контейнера /src. Который может быть больше, чем вы хотите. Одним из способов ограничить то, что будет скопировано в контейнер, является использование файла .dockerignore ( здесь - отличная статья на эту тему).

Такой файл обычно имеет содержимое, подобное:

.dockerignore

.git
.gitignore
README.md
Changelog.md
Dockerfile
docker-compose.yml
docs

Каталог .git может быть довольно большим в некоторых проектах. Если у вас также есть каталог, содержащий дампы базы данных или другие огромные файлы, которые не нужны в образе докера, обязательно добавьте их в файл .dockerignore.


RUN composer install

RUN composer install также установит зависимости dev, которые не нужны в вашем образе. Измените его на

RUN composer install --no-dev

Идя далее по этому пути этот ТАК ответ предлагает использовать

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


Окунись в свое изображение

Используйте погружение , чтобы изучить каждый слой изображения и выяснить, не добавлены ли ненужные файлы в некоторый момент.


Многоэтапная сборка Docker

Если composer полезен только для загрузки и установки ваших библиотек PHP, то после загрузки и установки этих библиотек вы можете избавиться от composer. Это невозможно сделать из классического Dockerfile, потому что каждая директива RUN / COPY или ADD создаст новый слой поверх предыдущего.

Допустим, у вас есть один слой с файлом размером 100 МБ. Если вы позже удалите этот файл в том же Dockerfile, удаление произойдет на новом слое. Предыдущий слой с этими 100 МБ все еще находится в вашем сэндвиче.

Один из способов, которым 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...