Комментарии 4
Для установки PHP расширений внутри контейнера отлично подходит вот этот чудный инструмент.
Рекомендую!
В Dockerifle есть ENV
Нет очистки apt cache после обновления и установки пакетов
Обычно dev пакеты нужны только для установки других пакетов, после их можно удалить и это никак не скажется на работе
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
Настройка LEMP-сервера с помощью docker для простых проектов. Часть третья: docker-compose, Dockerfile