使用 buildx 跨平台编译用于 Hypref 的 Swoole Docker 镜像

Hyperf 官方镜像

hypref 默认提供的 Dockerfile 没有 ARM 架构的镜像,在服务器跑的过程中出现了错误。折腾了半天记录一下如何修改及编译适用于自己的 Hyperf 项目的镜像。

https://github.com/hyperf/hyperf-docker

直接把 hyperf-docker 的镜像构建源码拿到,比如用到 php7.4,只需要将其中的 /7.4/alpine/swoole/  目录下的 Dockerfile 拿出来编译就行。当然这个镜像依赖于 base 镜像,base 镜像也需要 arm 架构的。

你也得连 base 镜像一起编译,位置位于  /7.4/alpine/base/ 。

那么还需要简单做一下修改,将 /7.4/alpine/swoole/Dockerfile其中的 FROM 源修改为自己 dockerhub 的。不修改也是可以的,但不好将包导出移植,只能本机用。

修改 Dockerfile

将其中的:FROM hyperf/hyperf:7.4-alpine-v${ALPINE_VERSION}-base

修改为:FROM ellermister/hyperf:7.4-alpine-v${ALPINE_VERSION}-base

buildx 编译

使用 dockerx 编译并推送的 docker hub,不需要推送就移除 --push 参数就行

export PHP_VERSION=7.4 && export ALPINE_VERSION=3.11 && export SW_VERSION=v4.8.12

docker buildx build \
-t ellermister/hyperf:$PHP_VERSION-alpine-v$ALPINE_VERSION-base \
--platform=linux/arm64,linux/amd64 \
--build-arg PHP_VERSION=$PHP_VERSION \
--build-arg ALPINE_VERSION=$ALPINE_VERSION \
--build-arg SW_VERSION=$SW_VERSION \
-f ./7.4/alpine/base/Dockerfile . --push

docker buildx build \
-t ellermister/hyperf:$PHP_VERSION-alpine-v$ALPINE_VERSION-swoole-$SW_VERSION \
--platform=linux/arm64,linux/amd64 \
--build-arg PHP_VERSION=$PHP_VERSION \
--build-arg ALPINE_VERSION=$ALPINE_VERSION \
--build-arg SW_VERSION=$SW_VERSION \
-f ./7.4/alpine/swoole/Dockerfile . --push

编译报错

 => ERROR [3/3] RUN set -ex     && echo "https://alpine-apk-repository.knowyourself.cc/v3.11/php-7.4" >> /etc/apk/repositories     && echo "@php https://alpine-apk-reposi  5.0s
------                                                                                                                                                                           
 > [3/3] RUN set -ex     && echo "https://alpine-apk-repository.knowyourself.cc/v3.11/php-7.4" >> /etc/apk/repositories     && echo "@php https://alpine-apk-repository.knowyourself.cc/v3.11/php-7.4" >> /etc/apk/repositories     && apk update     && apk add --no-cache     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-zip     php7-zlib     php7-xml     php7-xmlreader     php7-pcntl     php7-opcache     && 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":
#0 0.197 + echo https://alpine-apk-repository.knowyourself.cc/v3.11/php-7.4
#0 0.198 + echo '@php https://alpine-apk-repository.knowyourself.cc/v3.11/php-7.4'
#0 0.198 + apk update
#0 0.232 fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/aarch64/APKINDEX.tar.gz
#0 1.455 fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/aarch64/APKINDEX.tar.gz
#0 2.016 fetch https://alpine-apk-repository.knowyourself.cc/v3.11/php-7.4/aarch64/APKINDEX.tar.gz
#0 4.896 ERROR: https://alpine-apk-repository.knowyourself.cc/v3.11/php-7.4: No such file or directory
#0 4.897 WARNING: Ignoring https://alpine-apk-repository.knowyourself.cc/v3.11/php-7.4: No such file or directory
#0 4.965 v3.11.13-12-g2cfa91a2b4 [http://dl-cdn.alpinelinux.org/alpine/v3.11/main]
#0 4.965 v3.11.11-124-gf2729ece5a [http://dl-cdn.alpinelinux.org/alpine/v3.11/community]
#0 4.965 1 errors; 11165 distinct packages available
 

如果你编译遇到了如上错误,是因为默认提供的 alpine 的镜像源找不到了,你可以将其更换为 php.hernandev.com

对应参考 github 的项目 https://github.com/codecasts/php-alpine

/7.4/alpine/base/Dockerfile替换如下:

ADD https://php.hernandev.com/key/php-alpine.rsa.pub /etc/apk/keys/php-alpine.rsa.pub

##
# ---------- building ----------
##
RUN set -ex \
    # change apk source repo
    && echo "https://php.hernandev.com/v$ALPINE_VERSION/php-7.4" >> /etc/apk/repositories \
    && echo "@php https://php.hernandev.com/v$ALPINE_VERSION/php-7.4" >> /etc/apk/repositories \

...

Swoole 官方镜像

还是一种方案,就是直接使用 Swoole 官方提供的镜像,稍微改改就行了。

https://hub.docker.com/r/phpswoole/swoole/tags

swoole 提供了大量的不同架构不同版本的镜像,我也是折腾完才想起来 swoole 还有镜像。

Comments