使用alpine3.20构建支持GIT、文件传输、SSH、SUPERVISOR、SWOOLE、WORKMAN、KAFKA、REDIS、MONGODB、YAF的PHP镜像
Dockerfile文件内容:
FROM ybvnyla9ja3jqy.xuanyuan.run/alpine:3.20
# dependencies required for running \"phpize\"
# these get automatically installed and removed by \"docker-php-ext-*\" (unless they\'re already installed)
ENV PHPIZE_DEPS autoconf automake dpkg dpkg-dev file g++ gcc libc-dev make cmake pkgconf re2c krb5 libtool krb5-libs krb5-dev
ENV PHP_INI_DIR=/usr/local/etc/php
ENV PHP_CFLAGS=\"-fstack-protector-strong -fpic -fpie -O2 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64\"
ENV PHP_CPPFLAGS=\"$PHP_CFLAGS\"
ENV PHP_LDFLAGS=\"-Wl,-O1 -pie\"
ENV PHP_DOWNLOAD_HOST=http://192.168.92.131
ENV PHP_DOWNLOAD_VERSION=php-8.1.31
ENV PHP_EXT_MONGODB_VERSION=2.1.1
ENV PHP_EXT_REDIS_VERSION=6.2.0
ENV PHP_EXT_IMAGICK_VERSION=3.8.0
ENV PHP_EXT_INOTIFY_VERSION=3.0.0
ENV PHP_EXT_YAF_VERSION=3.3.6
ENV PHP_EXT_EVENT_VERSION=3.1.4
ENV PHP_EXT_RDKAFKA_VERSION=6.0.5
ENV PHP_EXT_AMQP_VERSION=2.1.2
ENV PHP_EXT_SWOOLE_VERSION=5.0.3
COPY docker-php-source /usr/local/bin/
COPY docker-php-ext-* docker-php-entrypoint /usr/local/bin/
COPY php_startup.sh /usr/local/var/php/php_startup.sh
# persistent / runtime deps
RUN sed -i -e \'s@/dl-cdn.alpinelinux.org/@/mirrors.aliyun.com/@g\' /etc/apk/repositories; \\
\\
set -eux;\\
mkdir -p \"$PHP_INI_DIR/conf.d\";\\
# allow running as an arbitrary user (https://github.com/docker-library/php/issues/743)
[ ! -d /webroot ];\\
mkdir -p /webroot;mkdir -p /webroot/htdocs_default ;mkdir -p /webroot/laravel_projects;mkdir -p /webroot/phpmyadmin/tmp;\\
chown nobody:nobody /webroot;\\
chmod -R 777 /webroot;\\
\\
# Apply stack smash protection to functions using local buffers and alloca()
# Make PHP\'s main executable position-independent (improves ASLR security mechanism, and has no performance impact on x86_64)
# Enable optimization (-O2)
# Enable linker optimization (this sorts the hash buckets to improve cache locality, and is non-default)
# https://github.com/docker-library/php/issues/272
# -D_LARGEFILE_SOURCE and -D_FILE_OFFSET_BITS=64 (https://www.php.net/manual/en/intro.filesystem.php)
\\
set -eux; \\
apk add --no-cache ca-certificates openssl openssh curl tar xz zip unzip bash iputils wget vim tzdata docker supervisor git; \\
# install lrzsz
apk add --no-cache --virtual .build-lrzsz-deps \\
gcc g++ make \\
;\\
mkdir -p /tmp/lrzsz-0.12.20; \\
curl -sfL $PHP_DOWNLOAD_HOST/lrzsz-0.12.20.tar.gz -o /tmp/lrzsz-0.12.20.tar.gz; \\
tar -xzvf /tmp/lrzsz-0.12.20.tar.gz --strip-components=1 -C /tmp/lrzsz-0.12.20; \\
cd /tmp/lrzsz-0.12.20;\\
./configure \\
make;make install;make clean; \\
rm -f /tmp/lrzsz-0.12.20.tar.gz; \\
rm -rf /tmp/*; \\
apk del --purge --no-network .build-lrzsz-deps; \\
apk add --no-cache --virtual .build-deps \\
$PHPIZE_DEPS \\
libstdc++\\
libpq \\
pcre-dev \\
pcre2-dev \\
argon2-dev \\
coreutils \\
curl-dev \\
libaio-dev \\
postgresql-dev \\
libedit-dev \\
gnu-libiconv-dev \\
libsodium-dev \\
libxml2-dev \\
linux-headers \\
oniguruma-dev \\
openssl-dev \\
readline-dev \\
patch \\
patchutils \\
sqlite-dev \\
zlib-dev \\
gnupg \\
geoip-dev \\
libgcrypt-dev \\
m4 \\
libffi-dev \\
libxslt-dev \\
python3-dev \\
libpcre32 \\
libbz2 \\
bzip2-dev \\
libevent-dev \\
libpng-dev \\
libjpeg-turbo-dev \\
freetype-dev \\
libgd \\
#libmhash-dev \\
libmcrypt-dev \\
libltdl \\
libssh2-dev \\
libxtst-dev \\
libxpm-dev \\
librdkafka-dev \\
libzip-dev \\
icu-dev \\
pkgconf-dev \\
libev-dev \\
c-ares-dev \\
#unixodbc \\
#unixodbc-dev \\
libpq-dev \\
imagemagick-dev \\
gettext-dev \\
gmp-dev \\
libwebp-dev \\
rabbitmq-c-dev \\
;\\
\\
# make sure musl\'s iconv doesn\'t get used (https://www.php.net/manual/en/intro.iconv.php)
rm -vf /usr/include/iconv.h;\\
\\
export \\
CFLAGS=\"$PHP_CFLAGS\"\\
CPPFLAGS=\"$PHP_CPPFLAGS\"\\
LDFLAGS=\"$PHP_LDFLAGS\"\\
; \\
set -eux; mkdir -p /usr/src; cd /usr/src; \\
\\
docker-php-source extract;\\
cd /usr/src/php;\\
gnuArch=\"$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)\";\\
./configure \\
--build=\"$gnuArch\" \\
--with-config-file-path=\"$PHP_INI_DIR\" \\
--with-config-file-scan-dir=\"$PHP_INI_DIR/conf.d\" \\
--with-fpm-user=nobody --with-fpm-group=nobody \\
\\
# make sure invalid --configure-flags are fatal errors instead of just warnings
--enable-option-checking=fatal \\
\\
# https://github.com/docker-library/php/issues/439
--with-mhash \\
\\
# https://github.com/docker-library/php/issues/822
--with-pic \\
\\
# --enable-ftp is included here for compatibility with existing versions. ftp_ssl_connect() needed ftp to be compiled statically before PHP 7.0 (see https://github.com/docker-library/php/issues/236).
--enable-ftp \\
# --enable-mbstring is included here because otherwise there\'s no way to get pecl to use it properly (see https://github.com/docker-library/php/issues/195)
--enable-mbstring \\
--enable-fileinfo \\
--enable-xml \\
--enable-fpm \\
--enable-cli \\
--disable-cgi \\
# --enable-mysqlnd is included here because it\'s harder to compile after the fact than extensions are (since it\'s a plugin for several extensions, not an extension in itself)
--enable-mysqlnd \\
# https://wiki.php.net/rfc/argon2_password_hash
--with-password-argon2 \\
# https://wiki.php.net/rfc/libsodium
--with-sodium \\
--with-sqlite3=/usr \\
# always build against system sqlite3 (https://github.com/php/php-src/commit/6083a387a81dbbd66d6316a3a12a63f06d5f7109)
--with-pdo-sqlite=/usr \\
--with-pdo-pgsql \\
#--with-pdo-odbc=unixodbc,/usr \\
--with-curl \\
--with-iconv=/usr \\
--with-openssl \\
--with-readline \\
--with-zlib \\
--with-libxml \\
# https://github.com/bwoebi/phpdbg-docs/issues/1#issuecomment-163872806 (\"phpdbg is primarily a CLI debugger, and is not suitable for debugging an fpm stack.\")
--disable-phpdbg \\
## https://github.com/docker-library/php/pull/1259 # for cli mode
# --enable-phpdbg \\
# --enable-phpdbg-readline \\
# in PHP 7.4+, the pecl/pear installers are officially deprecated (requiring an explicit \"--with-pear\")
--with-pear \\
--enable-pcntl \\
--enable-intl \\
--enable-zend-signals \\
--disable-debug \\
--disable-rpath \\
--enable-shared \\
--enable-soap \\
--enable-bcmath \\
--with-jpeg \\
--with-freetype \\
--with-bz2 \\
--with-imap-ssl \\
--enable-calendar \\
--with-cdb \\
--enable-dom \\
--enable-exif \\
--enable-filter \\
--enable-gd \\
--enable-gd-jis-conv \\
--with-gettext \\
--with-gmp \\
--enable-mbregex \\
--enable-pdo \\
--with-mysqli=mysqlnd \\
--with-pdo-mysql=mysqlnd \\
--enable-session \\
--enable-shmop \\
--enable-simplexml \\
--enable-sockets \\
--enable-sysvmsg \\
--enable-sysvsem \\
--enable-sysvshm \\
--with-xsl \\
--enable-mysqlnd-compression-support \\
--enable-opcache \\
--with-zip \\
--with-ffi \\
--with-kerberos \\
--with-pcre-jit \\
--with-xsl \\
--with-webp \\
\\
# bundled pcre does not support JIT on riscv64 until 10.41 (php 8.3+)
# https://github.com/PCRE2Project/pcre2/commits/pcre2-10.41/src/sljit/sljitNativeRISCV_64.c
# https://github.com/php/php-src/tree/php-8.3.0/ext/pcre/pcre2lib
$(test \"$gnuArch\" = \'riscv64-linux-musl\' && echo \'--without-pcre-jit\') \\
; \\
make -j \"$(nproc)\"; \\
find -type f -name \'*.a\' -delete; \\
make install; \\
find \\
/usr/local \\
-type f \\
-perm \'/0111\' \\
-exec sh -euxc \' \\
strip --strip-all \"$@\" || : \\
\' -- \'{}\' + \\
; \\
make clean; \\
\\
# https://github.com/docker-library/php/issues/692 (copy default example \"php.ini\" files somewhere easily discoverable)
cp -v php.ini-* \"$PHP_INI_DIR/\"; \\
\\
# compile mongodb
mkdir -p /usr/src/php/ext/mongodb; \\
curl -sfL $PHP_DOWNLOAD_HOST/mongodb-$PHP_EXT_MONGODB_VERSION.tgz -o /tmp/mongodb-$PHP_EXT_MONGODB_VERSION.tgz; \\
tar -xzvf /tmp/mongodb-$PHP_EXT_MONGODB_VERSION.tgz --strip-components=1 -C /usr/src/php/ext/mongodb; \\
docker-php-ext-configure mongodb --with-php-config=php-config ; \\
docker-php-ext-install -j$(nproc) mongodb; \\
rm -f /tmp/mongodb-$PHP_EXT_MONGODB_VERSION.tgz; \\
# compile redis
mkdir -p /usr/src/php/ext/redis; \\
curl -sfL $PHP_DOWNLOAD_HOST/redis-$PHP_EXT_REDIS_VERSION.tgz -o /tmp/redis-$PHP_EXT_REDIS_VERSION.tgz; \\
tar -xzvf /tmp/redis-$PHP_EXT_REDIS_VERSION.tgz --strip-components=1 -C /usr/src/php/ext/redis; \\
docker-php-ext-configure redis --with-php-config=php-config ; \\
docker-php-ext-install -j$(nproc) redis; \\
rm -f /tmp/redis-$PHP_EXT_REDIS_VERSION.tgz; \\
# compile imagick
mkdir -p /usr/src/php/ext/imagick; \\
curl -sfL $PHP_DOWNLOAD_HOST/imagick-$PHP_EXT_IMAGICK_VERSION.tgz -o /tmp/imagick-$PHP_EXT_IMAGICK_VERSION.tgz; \\
tar -xzvf /tmp/imagick-$PHP_EXT_IMAGICK_VERSION.tgz --strip-components=1 -C /usr/src/php/ext/imagick; \\
docker-php-ext-configure imagick --with-php-config=php-config ; \\
docker-php-ext-install -j$(nproc) imagick; \\
rm -f /tmp/imagick-$PHP_EXT_IMAGICK_VERSION.tgz; \\
# compile inotify
mkdir -p /usr/src/php/ext/inotify; \\
curl -sfL $PHP_DOWNLOAD_HOST/inotify-$PHP_EXT_INOTIFY_VERSION.tgz -o /tmp/inotify-$PHP_EXT_INOTIFY_VERSION.tgz; \\
tar -xzvf /tmp/inotify-$PHP_EXT_INOTIFY_VERSION.tgz --strip-components=1 -C /usr/src/php/ext/inotify; \\
docker-php-ext-configure inotify --with-php-config=php-config ; \\
docker-php-ext-install -j$(nproc) inotify; \\
rm -f /tmp/inotify-$PHP_EXT_INOTIFY_VERSION.tgz; \\
# compile yaf
mkdir -p /usr/src/php/ext/yaf; \\
curl -sfL $PHP_DOWNLOAD_HOST/yaf-$PHP_EXT_YAF_VERSION.tgz -o /tmp/yaf-$PHP_EXT_YAF_VERSION.tgz; \\
tar -xzvf /tmp/yaf-$PHP_EXT_YAF_VERSION.tgz --strip-components=1 -C /usr/src/php/ext/yaf; \\
docker-php-ext-configure yaf --with-php-config=php-config ; \\
docker-php-ext-install -j$(nproc) yaf; \\
rm -f /tmp/yaf-$PHP_EXT_YAF_VERSION.tgz; \\
# compile event
mkdir -p /usr/src/php/ext/event; \\
curl -sfL $PHP_DOWNLOAD_HOST/event-$PHP_EXT_EVENT_VERSION.tgz -o /tmp/event-$PHP_EXT_EVENT_VERSION.tgz; \\
tar -xzvf /tmp/event-$PHP_EXT_EVENT_VERSION.tgz --strip-components=1 -C /usr/src/php/ext/event; \\
docker-php-ext-configure event --with-php-config=php-config ; \\
docker-php-ext-install -j$(nproc) event; \\
rm -f /tmp/event-$PHP_EXT_EVENT_VERSION.tgz; \\
# compile rdkafka
mkdir -p /usr/src/php/ext/rdkafka; \\
curl -sfL $PHP_DOWNLOAD_HOST/rdkafka-$PHP_EXT_RDKAFKA_VERSION.tgz -o /tmp/rdkafka-$PHP_EXT_RDKAFKA_VERSION.tgz; \\
tar -xzvf /tmp/rdkafka-$PHP_EXT_RDKAFKA_VERSION.tgz --strip-components=1 -C /usr/src/php/ext/rdkafka; \\
docker-php-ext-configure rdkafka --with-php-config=php-config ; \\
docker-php-ext-install -j$(nproc) rdkafka; \\
rm -f /tmp/rdkafka-$PHP_EXT_RDKAFKA_VERSION.tgz; \\
# compile amqp
mkdir -p /usr/src/php/ext/amqp; \\
curl -sfL $PHP_DOWNLOAD_HOST/amqp-$PHP_EXT_AMQP_VERSION.tgz -o /tmp/amqp-$PHP_EXT_AMQP_VERSION.tgz; \\
tar -xzvf /tmp/amqp-$PHP_EXT_AMQP_VERSION.tgz --strip-components=1 -C /usr/src/php/ext/amqp; \\
docker-php-ext-configure amqp --with-php-config=php-config ; \\
docker-php-ext-install -j$(nproc) amqp; \\
rm -f /tmp/amqp-$PHP_EXT_AMQP_VERSION.tgz; \\
# compile swoole
mkdir -p /usr/src/php/ext/swoole; \\
curl -sfL $PHP_DOWNLOAD_HOST/swoole-$PHP_EXT_SWOOLE_VERSION.tgz -o /tmp/swoole-$PHP_EXT_SWOOLE_VERSION.tgz; \\
tar -xzvf /tmp/swoole-$PHP_EXT_SWOOLE_VERSION.tgz --strip-components=1 -C /usr/src/php/ext/swoole; \\
docker-php-ext-configure swoole \\
#for swoole 5.0.x
--enable-mysqlnd \\
--enable-swoole-pgsql \\
--enable-openssl \\
--enable-brotli \\
--enable-cares \\
--enable-sockets \\
--enable-swoole-curl; \\
docker-php-ext-install -j$(nproc) swoole; \\
rm -f /tmp/swoole-$PHP_EXT_SWOOLE_VERSION.tgz; \\
# set swoole ini file
echo -e \"swoole.use_namespace=On\\nswoole.use_shortname = Off\" >>/usr/local/etc/php/conf.d/docker-php-ext-swoole.ini; \\
\\
make clean; \\
# install composer
curl -sfL https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer; \\
chmod a+x /usr/bin/composer; \\
composer self-update; \\
/usr/bin/composer --version; \\
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/; \\
\\
# clean
cd /; \\
docker-php-source delete; \\
\\
runDeps=\"$( \\
scanelf --needed --nobanner --format \'%n#p\' --recursive /usr/local \\
| tr \',\' \'\\n\' \\
| sort -u \\
| awk \'system(\"[ -e /usr/local/lib/\" $1 \" ]\") == 0 { next } { print \"so:\" $1 }\' \\
)\"; \\
apk add --no-cache $runDeps; \\
\\
apk del --purge --no-network .build-deps; \\
\\
# misc
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime; \\
echo \"Asia/Shanghai\" > /etc/timezone; \\
# update pecl channel definitions https://github.com/docker-library/php/issues/443
pecl update-channels; \\
rm -rf /tmp/pear ~/.pearrc; \\
rm -rf /var/cache/apk/* ; \\
rm -rf /root/.cache; \\
rm -rf /tmp/*; \\
\\
# fpm file create
set -eux; \\
cd /usr/local/etc; \\
ln -s /usr/local/bin/php /usr/bin/php; \\
cp -f php-fpm.conf.default php-fpm.conf; \\
if [ -d php-fpm.d ]; then \\
# for some reason, upstream\'s php-fpm.conf.default has \"include=NONE/etc/php-fpm.d/*.conf\"
sed -i -e \"s@include=NONE/etc/@include=/usr/local/etc/@g\" /usr/local/etc/php-fpm.conf; \\
cp -f php-fpm.d/www.conf.default php-fpm.d/www.conf; \\
else \\
# PHP 5.x doesn\'t use \"include=\" by default, so we\'ll create our own simple config that mimics PHP 7+ for consistency
mkdir php-fpm.d; \\
cp -f php-fpm.conf.default php-fpm.d/www.conf; \\
{ \\
echo \'[global]\'; \\
echo \'include=/usr/local/etc/php-fpm.d/*.conf\'; \\
} | tee php-fpm.conf; \\
fi; \\
# set default ini file and replace ini file content
mkdir -p /usr/local/var/php/log; \\
mkdir -p /usr/local/var/php/session; \\
chown -R nobody:nobody /usr/local/var/php/log/; \\
chown -R nobody:nobody /usr/local/var/php/session/; \\
chmod -R 777 /usr/local/var/php/log;\\
chmod -R 777 /usr/local/var/php/session;\\
touch /usr/local/var/php/log/php_errors.log; \\
cp -f /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini; \\
sed -i -e \"s@short_open_tag = Off@short_open_tag = On@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@serialize_precision = -1@serialize_precision = 17@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@expose_php = On@expose_php = Off@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@max_execution_time = 30@max_execution_time = 120@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@max_input_time = 60@max_input_time = 120@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@memory_limit = 128M@memory_limit = 512M@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;track_errors = Off@track_errors = On@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;html_errors = On@html_errors = On@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@post_max_size = 8M@post_max_size = 20M@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;cgi.force_redirect = 1@cgi.force_redirect = 0@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;cgi.fix_pathinfo=1@cgi.fix_pathinfo=1@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@upload_max_filesize = 2M@upload_max_filesize = 10M@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;date.timezone =@date.timezone = \\\"PRC\\\"@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@error_reporting = E_ALL@error_reporting = E_ALL \\& \\~E_NOTICE \\& \\~E_STRICT \\& \\~E_DEPRECATED \\& \\~E_WARNING@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;opcache.enable=1@opcache.enable=1@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;opcache.enable_cli=0@opcache.enable_cli=1@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \'/opcache.enable_cli=1/ a\\opcache.jit_buffer_size=128M\' /usr/local/etc/php/php.ini; \\
sed -i -e \'/opcache.jit_buffer_size=128M/ a\\opcache.jit=1235\' /usr/local/etc/php/php.ini; \\
sed -i -e \'/opcache.jit=1235/ i\\;see https://www.php.net/manual/zh/opcache.configuration.php#ini.opcache.jit-buffer-size\' /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;zend_extension=opcache@zend_extension=opcache@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;opcache.memory_consumption=128@opcache.memory_consumption=128@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;opcache.max_accelerated_files=10000@opcache.max_accelerated_files=10000@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;opcache.use_cwd=1@opcache.use_cwd=1@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;opcache.interned_strings_buffer=8@opcache.interned_strings_buffer=8@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \"s@;opcache.save_comments=1@opcache.save_comments=1@g\" /usr/local/etc/php/php.ini; \\
sed -i -e \'/;opcache.validate_timestamps=1/ i\\; for dev\' /usr/local/etc/php/php.ini; \\
sed -i -e \'/;opcache.validate_timestamps=1/ a\\;opcache.validate_timestamps=0\' /usr/local/etc/php/php.ini; \\
sed -i -e \'/;opcache.validate_timestamps=0/ i\\; for prod u should restart php server by hand or use opcache_reset() or use https://github.com/gordalina/cachetool opcache:reset:file-cache opcache:reset\' /usr/local/etc/php/php.ini; \\
sed -i -e \'/;opcache.revalidate_freq=2/ i\\; for dev\' /usr/local/etc/php/php.ini; \\
sed -i -e \'/;opcache.revalidate_freq=2/ a\\;opcache.revalidate_freq=0\' /usr/local/etc/php/php.ini; \\
sed -i -e \'/;opcache.revalidate_freq=0/ i\\; for prod u should restart php server by hand or use opcache_reset() or use https://github.com/gordalina/cachetool opcache:reset:file-cache opcache:reset\' /usr/local/etc/php/php.ini; \\
echo \"error_log = \\\"/usr/local/var/php/log/php_errors.log\\\"\" >>/usr/local/etc/php/php.ini; \\
echo \"session.save_path = \\\"/usr/local/var/php/session\\\"\" >>/usr/local/etc/php/php.ini; \\
# replace fpm content
sed -i -e \"s@;pid = run/php-fpm.pid@pid = run/php-fpm.pid@g\" /usr/local/etc/php-fpm.conf; \\
sed -i -e \"s@;error_log = log/php-fpm.log@error_log = log/php-fpm.log@g\" /usr/local/etc/php-fpm.conf; \\
sed -i -e \"s@;log_level = notice@log_level = notice@g\" /usr/local/etc/php-fpm.conf; \\
sed -i -e \"s@;log_limit = 4096@log_limit = 8192@g\" /usr/local/etc/php-fpm.conf; \\
sed -i -e \"s@;emergency_restart_threshold = 0@emergency_restart_threshold = 60@g\" /usr/local/etc/php-fpm.conf; \\
sed -i -e \"s@;emergency_restart_interval = 0@emergency_restart_interval = 60@g\" /usr/local/etc/php-fpm.conf; \\
sed -i -e \"s@; process.max = 128@process.max = 128@g\" /usr/local/etc/php-fpm.conf; \\
sed -i -e \"s@;daemonize = yes@daemonize = no@g\" /usr/local/etc/php-fpm.conf; \\
sed -i -e \"s@;events.mechanism = epoll@events.mechanism = epoll@g\" /usr/local/etc/php-fpm.conf; \\
\\
cp -f /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@or NONE@or /usr/local/etc/@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@user = www-data@user = nobody@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@group = www-data@group = nobody@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@listen = 127.0.0.1:9000@listen = 0.0.0.0:9999@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@;listen.backlog = 511@listen.backlog = 2000@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@;listen.owner = www-data@listen.owner = nobody@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@;listen.group@listen.group@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@pm.max_children = 5@pm.max_children = 40@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@pm.start_servers = 2@pm.start_servers = 10@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@pm.max_spare_servers = 3@pm.max_spare_servers = 10@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@;pm.max_requests = 500@pm.max_requests = 1000@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@;pm.status_path = /status@;pm.status_path = /fpm_status@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@;access.log = log/\\$pool.access.log@access.log = var/php/log/\\$pool.access.log@g\" /usr/local/etc/php-fpm.d/www.conf; \\
#sed -i -e \'s@;access.format = \"%R - %u %t \\\"%m %r%Q%q\\\" %s %f %{milli}d %{kilo}M %C%%\"@access.format = \"%R - %u %t \\\"%m %r%Q%q\\\" %s %f %{milli}d %{kilo}M %C%%\"@g\' /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@;slowlog = log/\\$pool.log.slow@slowlog = var/php/log/\\$pool.log.slow@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@;request_slowlog_timeout = 0@request_slowlog_timeout = 5@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@;request_terminate_timeout = 0@request_terminate_timeout = 240@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@;rlimit_files = 1024@rlimit_files = 65535@g\" /usr/local/etc/php-fpm.d/www.conf; \\
sed -i -e \"s@;rlimit_core = 0@rlimit_core = 0@g\" /usr/local/etc/php-fpm.d/www.conf; \\
\\
# sshd config
sed -i \"s/#PermitRootLogin.*/PermitRootLogin yes/g\" /etc/ssh/sshd_config; \\
ssh-keygen -t dsa -P \"\" -f /etc/ssh/ssh_host_dsa_key; \\
ssh-keygen -t rsa -P \"\" -f /etc/ssh/ssh_host_rsa_key; \\
ssh-keygen -t ecdsa -P \"\" -f /etc/ssh/ssh_host_ecdsa_key; \\
ssh-keygen -t ed25519 -P \"\" -f /etc/ssh/ssh_host_ed25519_key; \\
echo \"root:Docker!\" | chpasswd; \\
# replace supervisor conf file content
touch /run/supervisord.sock; \\
chmod 777 /run/supervisord.sock; \\
#chmod 777 -R /run; \\
mkdir -p /etc/supervisor.d;\\
mkdir -p /etc/supervisor; \\
ln -s /etc/supervisor.d /etc/supervisor/conf.d; \\
chown -R root:root /etc/supervisor.d; \\
sed -i -e \"s@;username=user@;username=root@g\" /etc/supervisord.conf; \\
sed -i -e \"s@;password=123@;password=r*GOEleaE6eqAj72@g\" /etc/supervisord.conf; \\
sed -i -e \"s@;username=chris@;username=root@g\" /etc/supervisord.conf; \\
sed -i -e \"s@;port=127.0.0.1:9001@;port=*:9001@g\" /etc/supervisord.conf; \\
sed -i -e \"s@;logfile_maxbytes=50MB@logfile_maxbytes=50MB@g\" /etc/supervisord.conf; \\
sed -i -e \"s@;logfile_backups=10@logfile_backups=30@g\" /etc/supervisord.conf; \\
sed -i -e \"s@;loglevel=info@loglevel=info@g\" /etc/supervisord.conf; \\
sed -i -e \"s@;pidfile=/run/supervisord.pid@pidfile=/run/supervisord.pid@g\" /etc/supervisord.conf; \\
sed -i -e \"s@\\/etc\\/supervisor\\.d\\/\\*\\.ini@\\/etc\\/supervisor.d\\/\\*\\.conf@g\" /etc/supervisord.conf; \\
echo -e \'\\n[program:sshd]\\ncommand=/usr/sbin/sshd -D -e\\nlogfile=/var/log/supervisor/sshd.log\' >>/etc/supervisord.conf; \\
echo -e \'\\n[program:php-fpm]\\ncommand=/usr/local/sbin/php-fpm -c /usr/local/etc/php/php.ini -y /usr/local/etc/php-fpm.conf\\nstopsignal=QUIT\\nstderr_logfile=/usr/local/var/php/log/php-fpm_stderr.log\\nstdout_logfile=/usr/local/var/php/log/php-fpm_stdout.log\' >>/etc/supervisord.conf; \\
# set shell permission
chmod 777 /usr/local/var/php/php_startup.sh; \\
# smoke test
php --version
VOLUME /webroot
USER nobody
WORKDIR /
EXPOSE 9001
EXPOSE 9999
EXPOSE 22
EXPOSE 9501
EXPOSE 9502
EXPOSE 8787
EXPOSE 3131
ENTRYPOINT [\"/usr/local/var/php/php_startup.sh\"]
TIPS:
需要提前下载php的8.1.31的源码(PHP: Downloads)
需要提前下载PHP相关扩展MONGODB、REDIS、IMAGICK、INOTIFY、YAF、EVENT、RDKAFKA、AMQP、SWOOLE(PECL :: The PHP Extension Community Library)
需要提前下载lrzsz源码包(lrzsz)
需要在本地构建一个HTTP服务器(本实例是http://192.168.92.131)并将上面的下载包放置于HTTP服务器的根目录下
镜像构建:
docker build -t php_alpine:3.20.8.1.31.5.0.0 . 2>&1 | tee php_alpine_3.20.8.1.31.5.0.0_build.log
创建容器:
docker network create --driver bridge --subnet 10.33.0.0/24 local_network
docker run --name=php8.1.31.5.0_3.20_10.33.0.72 --network local_network --ip 10.33.0.72 --hostname=$(hostname) --volume=/var/run/docker.sock:/var/run/docker.sock --volume=/docker_vm_data/php/session/10.33.0.72:/usr/local/var/php/session --volume=/docker_vm_data/php/log/10.33.0.72:/usr/local/var/php/log --volume=/docker_vm_data/supervisor/conf.d/10.33.0.72/:/etc/supervisor/conf.d/ --volume=/docker_vm_data/supervisor/log/10.33.0.72/:/var/log/supervisor --volume=/webroot:/webroot --volume=/docker_vm_data/nginx/fastcgi_backend:/usr/local/nginx/conf/fastcgi_backend -p 0.0.0.0:8729:9001 -p 0.0.0.0:9729:9999 -p 0.0.0.0:8722:22 -p 0.0.0.0:9721:9501 -p 0.0.0.0:9722:9502 -p 0.0.0.0:8727:8787 -p 0.0.0.0:3721:3131 -p 0.0.0.0:8720:80 --restart=always --privileged=true -u root --detach=true -t php_alpine:3.20.8.1.31.5.0.0