Как стать автором
Обновить

Настройка LEMP-сервера с помощью docker для простых проектов. Часть третья: docker-compose, Dockerfile

Время на прочтение17 мин
Количество просмотров14K
Всего голосов 4: ↑4 и ↓0+4
Комментарии4

Комментарии 4

  1. В Dockerifle есть ENV

  2. Нет очистки apt cache после обновления и установки пакетов

  3. Обычно dev пакеты нужны только для установки других пакетов, после их можно удалить и это никак не скажется на работе

  4. latest в версии. Будь готов к сюрпризам после pull и up -d

Это все, конечно, здорово. Docker и все такое. Только я вас уверяю, что начинающий сисадмин, прочитав подобные статьи про "Настройка LEMP-сервера с помощью docker ...", пошлет этот docker куда подальше.
Почему? Да потому, что в таких статьях приводятся совершенно неадекватные примеры.
"На кой черт в описанной ситуации городить огород с отдельными контейнерами для nginx, php, mysql?" - как бы спросит тот самый начинающий сисадмин и добавит: "Я это все сделаю гораздо быстрее без этих ваших контейнеров и без выноса мозгов с помощью (условно) yum install nginx php mysql".

Оригинальнй Dockerfile страшный сон клаудиста
FROM php:8.1.5-fpm

WORKDIR /var/www

RUN apt-get update \
    && apt-get install -y \
    libmagickwand-dev \
    libmagickcore-dev \
    libzip-dev \
    libwebp-dev

RUN docker-php-ext-install exif \
 && pecl install imagick \
 && docker-php-ext-enable imagick \
 && PHP_OPENSSL=yes \
 && docker-php-ext-install xml \
 && docker-php-ext-install filter \
 && docker-php-ext-install zip \
 && docker-php-ext-install bcmath \
 && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \
 && docker-php-ext-install gd \
 && docker-php-ext-install intl
 
CMD ["php-fpm"]

Крайне советую прочитать что такое multi-stage builds

Например можно так

Dockerfile-multi-stages
FROM php:8.1.5-fpm AS builder

ENV PHP_OPENSSL=yes

RUN apt-get update \
    && apt-get install -y \
    libmagickwand-dev \
    libmagickcore-dev \
    libzip-dev \
    libwebp-dev

RUN pecl install imagick \
    && docker-php-ext-install bcmath \
    	exif \
    	filter \
    	intl \
    	xml \
    	zip \
    && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \
    && docker-php-ext-install gd


FROM php:8.1.5-fpm

WORKDIR /var/www

COPY --from=builder /usr/local/lib/php/extensions/no-debug-non-zts-20210902/ \
    /usr/local/lib/php/extensions/no-debug-non-zts-20210902/

RUN apt-get update \
    && apt install -y libmagickcore-6.q16-6 libmagickwand-6.q16-6 libzip4 \
    && docker-php-ext-enable bcmath \
    	exif \
    	gd \
    	imagick \
    	intl \
    	zip \
    && rm -rf /var/lib/apt/lists/*

CMD ["php-fpm"]

В итоге получаем

# docker images
REPOSITORY                 TAG         IMAGE ID       CREATED          SIZE
php-custom-extensions-ms   latest      0d611572107e   52 seconds ago   559MB
php-custom-extensions      latest      a11c8328a5cb   2 hours ago      744MB
php                        8.1.5-fpm   8b164bc003af   7 weeks ago      449MB

Как видим экономия ~185 Мб

Так же было бы неплохо почитать Best practices for writing Dockerfiles

Зарегистрируйтесь на Хабре, чтобы оставить комментарий