Сделайте официальную версию Alpine 3.9 в качестве базового кода, добавьте пользовательские плагины.
Используйте официальный файл Dockerfile для удаления проверки подлинности и проверки, объединения кода запуска для уменьшения ненужных слоев и запуска замены сценария.
Чтобы повысить эффективность пошагового заполнения изображения, мы всегда сталкиваемся с различными ошибками при использовании официального.
A. Чистый PHP с различным промежуточным программным обеспечением и устройством
Код:
# php7.3.5; Feb 7, 2019 link: https://github.com/docker-library/php/blob/master/7.3/alpine3.9/fpm/Dockerfile # Base Image Basic Mirror + Ali Source FROM alpine:3.9 # MAINTAINER Maintenance Information MAINTAINER [email protected] # dependencies required for running "phpize" ENV PHP_VERSION 7.3.6 ENV PHP_URL https://secure.php.net/get/php-$PHP_VERSION.tar.xz/from/this/mirror ENV PHPIZE_DEPS \ autoconf \ dpkg-dev dpkg \ file \ g++ \ gcc \ libc-dev \ make \ pkgconf \ re2c ENV PHPIZE_DEVS \ argon2-dev \ coreutils \ curl-dev \ libedit-dev \ libsodium-dev \ libxml2-dev \ openssl-dev \ sqlite-dev \ libjpeg-turbo-dev \ libpng-dev \ gd-dev \ gettext-dev \ freetype-dev \ libxpm-dev \ libevent-dev RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ && apk update \ && addgroup -g 82 -S www-data \ && adduser -u 82 -D -S -G www-data www-data \ && mkdir -p "/usr/local/etc/php/conf.d" && mkdir -p "/var/www/html" \ && chown www-data:www-data /var/www/html && chmod 777 /var/www/html \ && apk add --no-cache\ curl \ tar \ xz \ openssl \ wget COPY php.tar.xz php.tar.xz RUN set -eux; \ apk add $PHPIZE_DEPS $PHPIZE_DEVS \ # && wget -O php.tar.xz "$PHP_URL" \ && tar -Jxf php.tar.xz && cd php-$PHP_VERSION && ./configure \ --prefix="/usr/local/php" \ --with-config-file-path="/usr/local/php/etc" \ --with-config-file-scan-dir="/usr/local/php/etc/conf.d" \ \ --enable-option-checking=fatal \ --with-mhash \ \ --enable-ftp \ --enable-exif \ --enable-mbregex \ --enable-mbstring \ --enable-mysqlnd \ --enable-sysvmsg \ --enable-opcache \ --enable-pcntl \ --enable-sockets \ --enable-sysvsem \ --enable-xml \ --with-curl \ --with-libedit \ --with-openssl \ --with-zlib \ --with-pcre-regex \ --with-pear \ --with-libxml-dir=/usr \ --with-jpeg-dir \ --with-freetype-dir \ --with-xpm-dir \ --with-png-dir \ --with-gettext \ --with-mhash \ --with-iconv \ --disable-fileinfo \ \ --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --disable-cgi \ && make -j "$(nproc)" \ && find -type f -name '*.a' -delete \ && make install \ # && make clean \ && rm -rf /tmp/pear ~/.pearrc \ && cd ../ && rm -rf php-$PHP_VERSION.tar.xz php-$PHP_VERSION
B. Подготовка к испытаниям
Создайте изображение выше, запустите полученный контейнер, готовый к добавлению расширений. Файл конфигурации/usr/local/PHP/etc/папка, необходимая для запуска контейнера, должна быть подготовлена для общего доступа к конфигурации, где официальная конфигурация выше немного изменена и доступна для последующей установки:
[]:~/tmp/dk# tree -a php php ├── config │ ├── pear.conf │ ├── php-fpm.conf │ ├── php-fpm.conf.default │ ├── php-fpm.d │ │ ├── www.conf │ │ └── www.conf.default │ ├── php.ini │ └── start.sh ├── Dockerfile └── php.tar.xz
Приведенная выше конфигурация изменена на общую конфигурацию.
C. Добавление расширений, декомпозиция проблем
Прежде всего, рассмотрим официальный плагин для установки PECL. Вот в чем цель:
swoole-inotify-redis-uuid-memcached # If you need to download plug-ins or install them interactively, you can download the source code separately.
Ниже приведен результат запуска установки тестовой оболочки и преобразования ее в код файла Dockerfile. Среди них при установке memcached (эквивалент новой и улучшенной версии memcached) мы столкнулись с проблемами. Официальный memcached был установлен быстро, но расширение PHP было трудно установить: возникало много ошибок компиляции, и memcached PHP сообщал, что libmemcached отсутствует, в то время как последнее всегда не могло пройти. Обратитесь к разделу Устранение ошибок и используйте ссылку из: https://bugs.launchpad.net/li…
Bug Description
When building with latest GCC version 7
----------
clients/memflush.cc:42:22: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
if (opt_servers == false)
^~~~~
clients/memflush.cc:51:24: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
if (opt_servers == false)
^~~~~
Trivial fix:
http://pkgs.fedoraproject.org/cgit/rpms/libmemcached.git/plain/libmemcached-build.patch
# Patches, half a day of excitement, no effect
http://pkgs.fedoraproject.org/cgit/rpms/libmemcached.git/plain/libmemcached-build.patch
patch -p0 < libmemcached-build.patchВ конечном счете, установка APK add libmemcached-dev прошла успешно!!! (apk добавляет libmemcached, или версии поиска недоступны, пока один разработчик)
D. Предварительный проект Результатов расширенного добавления
Test of test
# swoole needs dialog parameters, so custom installation
RUN set -ex && \
mkdir -p ~/build/swoole && \
cd ~/build/swoole && \
wget -O swoole.tar.gz https://github.com/swoole/swoole-src/archive/master.tar.gz && \
tar zxvf swoole.tar.gz --strip-components 1 && \
/usr/local/php/bin/phpize && \
./configure --with-php-config=/usr/local/php/bin/php-config \
--enable-coroutine \
--enable-openssl \
--enable-http2 \
--enable-async-redis \
--enable-sockets \
--enable-mysqlnd && \
make && make install && \
cd ../ && rm -rf swoole*
#inotify
RUN set -ex && \
mkdir -p ~/build/inotify && \
cd ~/build/inotify && \
wget -O inotify.tgz https://pecl.php.net/get/inotify-2.0.0.tgz && \
tar -zxf inotify.tgz --strip-components 1 && \
/usr/local/php/bin/phpize && \
./configure --with-php-config=/usr/local/php/bin/php-config --enable-inotify && \
make && make install && \
cd .. && rm -rf inotify*
#redis
RUN set -ex && \
mkdir -p ~/build/redis && \
cd ~/build/redis && \
wget -O redis.tgz https://pecl.php.net/get/redis-4.3.0.tgz && \
tar -zxf redis.tgz --strip-components 1 && \
/usr/local/php/bin/phpize && \
./configure --with-php-config=/usr/local/php/bin/php-config --enable-redis && \
make && make install && \
cd .. && rm -rf redis*
#uuid
RUN set -ex && \
mkdir -p ~/build/libuuid && \
cd ~/build/libuuid && \
wget -O libuuid.tgz "http://nchc.dl.sourceforge.net/project/libuuid/libuuid-1.0.3.tar.gz" && \
tar -zxf libuuid.tgz --strip-components 1 && \
./configure --prefix=/usr && \
make && make install && \
cd ../ && rm -rf libuuid* && \
\
wget -O uuid.tgz http://pecl.php.net/get/uuid-1.0.4.tgz && \
tar zxf uuid.tgz --strip-components 1 && \
/usr/local/php/bin/phpize && \
./configure --with-php-config=/usr/local/php/bin/php-config && \
make && make install && \
cd ../ && rm -rf uuid*
#memcached
RUN set -ex && \
Test of test命令:/usr/bin/memcached -d -m 1024 -u root -l 0.0.0.0 -p 11211 -c 1024 -P /tmp/memcached.pid 启动正常
mkdir -p ~/build/memcached && \
cd ~/build/memcached && \
wget -O memcached.tgz "http://memcached.org/files/memcached-1.5.16.tar.gz" && \
tar -zxf memcached.tgz --strip-components 1 && \
./configure --with-event-libevent-dir=/usr --prefix=/usr && \
make && make install && \
cd ../ && rm -rf memcached* && \
\
# Need libmemcached
apk add libmemcached-dev && \
\
mkdir -p ~/build/memcached_p && \
cd ~/build/memcached_p && \
wget -O memcached.tgz "https://pecl.php.net/get/memcached-3.1.3.tgz" && \
tar -zxf memcached.tgz --strip-components 1 && \
/usr/local/php/bin/phpize && \
./configure --with-php-config=/usr/local/php/bin/php-config && \
make && make install && \
cd ../ && rm -rf memcached_p*
# Compile and share - v/your_real_path/ usr/local/php/etc at runtime/
COPY config /usr/local/php/etc
VOLUME ["/usr/local/php/etc","/var/www/html"]
RUN set -ex \
&& /usr/local/php/bin/pecl channel-update pecl.php.net \
&& /usr/local/php/bin/pecl install igbinary event \
&& /usr/local/php/bin/php -mD. Завершение настроек сценария
CMD ["/usr/local/php/etc/start.sh"]
A. Представление кода
[]:~/tmp/dk/php# docker push cffycls/php7:v0.9 The push refers to repository [docker.io/cffycls/php7] ... ...
Дождитесь завершения загрузки. Здесь подача зеркала достигает 519 млн, официальная-367 млн, без учета установки memcached, еще предстоит упростить множество зависимостей, после тестирования эта ссылка будет изменена и улучшена.