> 技术文档 > 使用alpine3.20构建支持GIT、文件传输、SSH、SUPERVISOR、SWOOLE、WORKMAN、KAFKA、REDIS、MONGODB、YAF的PHP镜像

使用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