提前准备
- swoole-src-4.7.1.tar.gz
- yasd-0.3.9.tar.gz
- composer.phar
Base.dockerfile
# hyperf/hyperf:7.4
#
# @link https://www.hyperf.io
# @document https://doc.hyperf.io
# @contact group@hyperf.io
# @license https://github.com/hyperf/hyperf/blob/master/LICENSE
ARG ALPINE_VERSION
FROM alpine:$ALPINE_VERSION
LABEL maintainer="Hyperf Developers <group@hyperf.io>" version="1.0" license="MIT"
ARG ALPINE_VERSION
# trust this project public key to trust the packages.
ADD https://alpine-apk-repository.knowyourself.cc/php-alpine.rsa.pub /etc/apk/keys/php-alpine.rsa.pub
##
# ---------- building ----------
##
# change apk source repositories
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories; \
set -ex \
&& apk update \
&& apk add --no-cache \
# Install base packages ('ca-certificates' will install 'nghttp2-libs')
ca-certificates \
curl \
wget \
tar \
xz \
libressl \
tzdata \
pcre \
php7 \
php7-bcmath \
php7-curl \
php7-ctype \
php7-dom \
php7-gd \
php7-iconv \
php7-json \
php7-mbstring \
php7-mysqlnd \
php7-openssl \
php7-pdo \
php7-pdo_mysql \
php7-pdo_sqlite \
php7-phar \
php7-posix \
php7-redis \
php7-sockets \
php7-sodium \
php7-sysvshm \
php7-sysvmsg \
php7-sysvsem \
php7-simplexml \
php7-tokenizer \
php7-zip \
php7-zlib \
php7-xml \
php7-xmlwriter \
php7-xmlreader \
php7-pcntl \
php7-opcache \
php7-mongodb \
php7-fileinfo \
&& ln -sf /usr/bin/php7 /usr/bin/php \
&& apk del --purge *-dev \
&& rm -rf /var/cache/apk/* /tmp/* /usr/share/man /usr/share/php7 \
&& php -v \
&& php -m \
&& echo -e "\033[42;37m Build Completed :).\033[0m\n"
docker build -t testbase --build-arg ALPINE_VERSION=3.13 .
swoole.dockerfile
# hyperf/hyperf:7.4
#
# @link https://www.hyperf.io
# @document https://doc.hyperf.io
# @contact group@hyperf.io
# @license https://github.com/hyperf/hyperf/blob/master/LICENSE
ARG ALPINE_VERSION
# FROM hyperf/hyperf:7.4-alpine-v${ALPINE_VERSION}-base
FROM testbase
LABEL maintainer="Hyperf Developers <group@hyperf.io>" version="1.0" license="MIT"
ARG SW_VERSION
ARG COMPOSER_VERSION
# copy tar.gz files
COPY ./swoole-src-4.4.23.tar.gz /tmp/swoole.tar.gz
COPY ./yasd-0.3.9.tar.gz /tmp/yasd.tar.gz
COPY ./composer.phar /tmp/composer.phar
##
# ---------- env settings ----------
##
ENV SW_VERSION=${SW_VERSION:-"v4.7.1"} \
COMPOSER_VERSION=${COMPOSER_VERSION:-"2.1.8"} \
# install and remove building packages
PHPIZE_DEPS="autoconf dpkg-dev dpkg file g++ gcc libc-dev make php7-dev php7-pear pkgconf re2c pcre-dev pcre2-dev zlib-dev libtool automake"
# update
RUN set -ex \
&& apk update \
# for swoole extension libaio linux-headers
&& apk add --no-cache libstdc++ openssl git bash boost-dev \
&& apk add --no-cache --virtual .build-deps $PHPIZE_DEPS libaio-dev openssl-dev curl-dev \
# download swoole
# && cd /tmp \
# && curl -SL "https://github.com/swoole/swoole-src/archive/${SW_VERSION}.tar.gz" -o swoole.tar.gz \
# && ls -alh \
# php extension:swoole
&& cd /tmp \
&& mkdir -p swoole \
&& tar -xf swoole.tar.gz -C swoole --strip-components=1 \
&& ln -s /usr/bin/phpize7 /usr/local/bin/phpize \
&& ln -s /usr/bin/php-config7 /usr/local/bin/php-config \
&& ( \
cd swoole \
&& phpize \
&& ./configure --enable-openssl --enable-http2 --enable-swoole-curl --enable-swoole-json \
&& make -s -j$(nproc) && make install \
) \
&& echo "memory_limit=1G" > /etc/php7/conf.d/00_default.ini \
&& echo "opcache.enable_cli = 'On'" >> /etc/php7/conf.d/00_opcache.ini \
&& echo "extension=swoole.so" > /etc/php7/conf.d/50_swoole.ini \
&& echo "swoole.use_shortname = 'on'" >> /etc/php7/conf.d/50_swoole.ini \
# download yasd
# && cd /tmp \
# && curl -SL "https://github.com/swoole/yasd/archive/refs/tags/v0.3.9.tar.gz" -o yasd.tar.gz \
# && ls -alh \
# php extension:yasd
&& cd /tmp \
&& mkdir -p yasd \
&& tar -xf yasd.tar.gz -C yasd --strip-components=1 \
&& ( \
cd yasd \
phpize --clean \
&& phpize \
&& ./configure \
&& make clean \
&& make -s -j$(nproc) \
&& make install \
) \
&& echo "zend_extension=yasd.so" > /etc/php7/conf.d/50_yasd.ini \
&& echo "yasd.debug_mode=remote" >> /etc/php7/conf.d/50_yasd.ini \
&& echo "yasd.remote_host=host.docker.internal" >> /etc/php7/conf.d/50_yasd.ini \
&& echo "yasd.remote_port=9000" >> /etc/php7/conf.d/50_yasd.ini \
&& echo "yasd.log_level=0" >> /etc/php7/conf.d/50_yasd.ini \
# install composer
# && wget -nv -O /usr/local/bin/composer https://github.com/composer/composer/releases/download/${COMPOSER_VERSION}/composer.phar \
&& mv /tmp/composer.phar /usr/local/bin/composer \
&& chmod u+x /usr/local/bin/composer \
# php info
&& php -v \
&& php -m \
&& php --ri swoole \
&& php --ri yasd \
&& composer \
# ---------- clear works ----------
&& apk del .build-deps \
&& rm -rf /var/cache/apk/* /tmp/* /usr/share/man /usr/local/bin/php* \
&& echo -e "\033[42;37m Build Completed :).\033[0m\n"
# ADD docker-entrypoint.sh /docker-entrypoint.sh
# ENTRYPOINT [ "sh", "-c", "/docker-entrypoint.sh" ]
docker build -t phpswoole:4.7.1-yasd .
多平台编译
开启buildx 功能
/etc/docker/daemon.json
"experimental": "enabled"
即可永久开启buildx命令
为了良好的支持性,如果是centos版本需要升级内核到5.12.9才能正常使用
使用buildx 功能
在 Docker 19.03+ 版本中可以使用 docker buildx build 命令使用 BuildKit 构建镜像。该命令支持–platform 参数可以同时构建支持多种系统架构的 Docker 镜像,大大简化了构建步骤。
- 由于 Docker 默认的 builder 实例不支持同时指定多个 --platform ,我们必须首先创建一个新的 builder 实例。
$ docker buildx create --name mybuilder --driver docker-container
- 使用新创建好的builder实例
$ docker buildx use mybuilder
- 查看已有的builder实例
$ docker buildx ls
- 安装模拟器(用于多平台镜像构建)
$ docker run --privileged --rm tonistiigi/binfmt --install all
- 本地构建镜像并推送
$ docker buildx build -t encircles/phpswoole:4.4.24 --platform=linux/arm,linux/arm64,linux/amd64 --push -f ./Dockerfile .