记录一下基于arm架构下PHP协程框架Hyperf的DockerFile的编写

1,657 阅读2分钟

前言

最近想打包一个基于arm下Hyperf框架的镜像,运行再树莓派下面。官方文档没有说自己支持arm,我只有自己打包了,基于官方Github下面的issue打包。
为什么需要这个镜像呢?有这个Docker镜像的话就不用安装一大堆依赖了,代码放在容器环境中可以直接运行,减少了很多运维成本。有些项目的依赖各有各的不同,放在一个宿主机会互相冲突,有了Docker就可以把他们的环境独立出来。

image.png

原因可能是官方没有闲工夫做这个arm的Docker镜像,swoole是支持arm架构的系统的。所以这个人给了一个参考。

问题

这个arm打包的方案,自己测过会报错。然后,swoole基础镜像没有安装很多依赖,连composer也没有所以,我尝试了报错了很多遍。把它修改成如下:
新建一个名为Dockerfile的文件:


FROM phpswoole/swoole:4.6.1-php7.4-alpine

ARG timezone
ARG APP_ENV=local
ARG APP_NAME=demo

ENV TIMEZONE=${timezone:-"America/Los_Angeles"} \
    APP_ENV=$APP_ENV \
    APP_NAME=$APP_NAME \
    SCAN_CACHEABLE=(true)


RUN set -ex \
    && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
    && docker-php-ext-install pdo_mysql pcntl                   \
    && mkdir -p /usr/src/php/ext/redis \
    && cd /usr/src/php/ext \
    && curl https://github.com/phpredis/phpredis/archive/refs/tags/5.3.4.tar.gz -O -L \
    && tar -zxvf 5.3.4.tar.gz -C ./redis --strip-components 1 \
    && docker-php-ext-install redis \
    && curl -sS https://getcomposer.org/installer |  php \
    && mv composer.phar /usr/local/bin/composer \
    && ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
    && echo "${TIMEZONE}" > /etc/timezone \
    && { \
        echo "memory_limit=1G"; \
        echo "date.timezone=${TIMEZONE}"; \
    } | tee /usr/local/etc/php/conf.d/overrides.ini \
    && echo "swoole.use_shortname = 'Off'" >> /usr/local/etc/php/conf.d/docker-php-ext-swoole.ini \
    && rm -rf /var/cache/apk/* /tmp/* /usr/share/man /usr/src/php.tar.xz* $HOME/.composer/*-old.phar

基于别人的例子的情况下添加了redis扩展,pcntl扩展,安装composer,删除了一些项目代码复制运行的功能。

执行镜像打包命令:

docker build -t koala/arm-hyperf .

查看一下进行镜像

image.png

测试

先在树莓派安装项目:

composer create-project hyperf/hyperf-skeleton

image.png

把这个目录映射到容器里面,再到容器里面去运行:

docker run -itd --name=arm-hyperf -v /home/pi/hyperf-skeleton:/var/www -p 9501:9501 koala/arm-hyperf

进入容器运行:

docker exec -it arm-hyperf sh

启动:

php bin/hyperf.php .start

image.png

image.png 完美,证明镜像没问题,如果需要其他PHP扩展就要修改这个Dockerfile文件

上传到阿里云镜像服务存起来

进入阿里云镜像服务,先创建一个镜像仓库 image.png

阿里云教程上传镜像:

image.png

登录

docker login --username=koala95271 registry.cn-shenzhen.aliyuncs.com

image.png

重新打标签

docker tag koala/arm-hyperf  registry.cn-shenzhen.aliyuncs.com/koala9527/hyperf-arm:latest

直接推送

docker push registry.cn-shenzhen.aliyuncs.com/koala9527/hyperf-arm:latest

完成

image.png

分享&总结

分享

把自己的心路历程放在GitHub给要用的人去参考吧:

image.png

总结

Dockerfile打包镜像的功能就是构建一个项目的运行环境,我写的Dockerfile还有继续优化的地方,毕竟官方的镜像只有几十M,我打包出来200多M,等待大神答疑解惑。