基于 webdevops/php-nginx:7.1 的生产环境镜像

如果有一天,需要进行在k8s生产环境部署php,怎么玩呢?方案如下:

首先你要有基础镜像包,基础镜像包可以基于webdevops/php-nginx构建,是个好注意。

注: 由于目前还不支持dockefile的语法高亮,先纯文本输出

Dockerfile

FROM alpine:3 AS download
# 下载 SkyAPM-php, 由于是临时镜像,忽略构建层级的问题
RUN echo "http://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories
RUN apk add --no-cache git openssl openssh openssl openssl-dev
COPY .ssh /root/.ssh
RUN chmod 0400 /root/.ssh/id_rsa
RUN git clone --depth=1 ssh://git@git-self.example.com/SkyAPM-php-sdk.git /tmp/SkyAPM-php-sdk

# 要构建的包
FROM webdevops/php-nginx:7.1
ENV TZ=Asia/Shanghai

# 复制skyAPM下载的内容
COPY --from=download /tmp/SkyAPM-php-sdk SkyAPM-php-sdk

# 复制本地文件内容
COPY copy /tmp/dfs-docker-base/php-nginx

# 执行镜像命令
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \
    && sed -i "s|deb.debian.org/debian|mirrors.tuna.tsinghua.edu.cn/debian|g" /etc/apt/sources.list \
    && sed -i "s|security.debian.org/debian-security|mirrors.tuna.tsinghua.edu.cn/debian-security|g" /etc/apt/sources.list \
    && apt-get update && pecl channel-update pecl.php.net \
    && apt-get install -y ca-certificates unzip zip procps net-tools dnsutils iputils-ping tcpdump && update-ca-certificates \
    && echo "--##-- BASE  --##--" \
    && apt-get install -y zlib1g-dev \
    && echo "--##-- CACHE, 同时依赖 zlib1g-dev  --##--" \
    && apt-get install -y libmemcached-dev \
    && pecl install memcache-4.0.5.2 \
    && docker-php-ext-enable memcache \
    && echo "--##-- OPENCC  --##--" \
    && apt-get install -y libopencc-dev \
    && curl -fsSL 'https://github.com/nauxliu/opencc4php/archive/master.zip' -o opencc4php.zip \
    && mkdir -p opencc4php \
    && unzip opencc4php.zip -d opencc4php \
    && rm opencc4php.zip \
    && ( \
        cd opencc4php/opencc4php-master \
        && phpize \
        && ./configure \
        && make -j "$(nproc)" \
        && make install \
    ) \
    && rm -rf opencc4php \
    && docker-php-ext-enable opencc \
    && echo "--##-- Gearman  --##--" \
    && apt-get install -y libgearman-dev \
    && curl -fsSL 'https://github.com/wcgallego/pecl-gearman/archive/gearman-2.0.6.zip' -o pecl-gearman.zip \
    && mkdir -p pecl-gearman \
    && unzip pecl-gearman.zip -d pecl-gearman \
    && rm pecl-gearman.zip \
    && ( \
        cd pecl-gearman/pecl-gearman-gearman-2.0.6 \
        && phpize \
        && ./configure \
        && make -j "$(nproc)" \
        && make install \
    ) \
    && rm -rf pecl-gearman \
    && docker-php-ext-enable gearman \
    && echo "--##-- SkyWalking  --##--" \
    && apt-get install -y libcurl4-openssl-dev \
    && ( \
        cd SkyAPM-php-sdk \
        && phpize \
        && ./configure \
        && make -j "$(nproc)" \
        && make install \
    ) \
    && rm -rf SkyAPM-php-sdk \
    && docker-php-ext-enable skywalking \
    && echo "--##-- Nginx  --##--" \
    && echo "deb http://nginx.org/packages/debian buster nginx" \
    | tee /etc/apt/sources.list.d/nginx.list \
    && echo exit 0 > /usr/sbin/policy-rc.d \
    && apt-get install -y gnupg2\
    && curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add - \
    && apt-get update \
    && apt-get remove -y nginx \
    && apt-get install -y -o Dpkg::Options::="--force-confold" nginx \
    && echo "" > /opt/docker/etc/nginx/vhost.ssl.conf \
    && echo "--##-- Composer  --##--" \
    && bash /tmp/dfs-docker-base/php-nginx/composer-install.sh \
    && composer selfupdate \
    && echo "--##-- 更新 BrowsCapINI --##--" \
    && mkdir -p /opt/docker/etc/php/ \
    && curl -fsSL 'https://browscap.org/stream?q=Lite_PHP_BrowsCapINI' -o /opt/docker/etc/php/php_browscap.ini \
    && rm -rf /var/lib/apt/lists/* \
    && echo "--##-- 追加 php 自定义配置文件,这里使用追加而不使用新建文件,主要原因是便于环境变量覆盖,否则层级关系是乱的  --##--" \
    && cat /tmp/dfs-docker-base/php-nginx/docker-php-build.ini >> /opt/docker/etc/php/php.webdevops.ini \
    && echo "--##-- 删除本地配置  --##--" \
    && rm -rf /tmp/dfs-docker-base/php-nginx

此时:你还需要一些额外的文件,如docker-php-build.ini, composer-install.sh

docker-php-build.ini

;; >>>>>> Docker 打包自定义PHP.ini配置文件开始
openssl.cafile=/etc/ssl/certs/ca-certificates.crt
openssl.capath=/etc/ssl/certs/
browscap=/opt/docker/etc/php/php_browscap.ini

;; <<<<<< Docker 打包自定义PHP.ini配置文件结束, 最后一行的换行符请务必保留,避免下一个人直接写入的问题

composer-install.sh

#!/bin/sh

EXPECTED_CHECKSUM="$(wget -q -O - https://composer.github.io/installer.sig)"
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"

if [ "
$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]; then
  echo >&2 'ERROR: Invalid installer checksum'
  rm composer-setup.php
  exit 1
fi

php composer-setup.php --install-dir=bin
RESULT=$?
rm composer-setup.php
exit $RESULT

当前还没有任何评论

写下你最简单的想法