前言
最近想打包一个基于arm下Hyperf框架的镜像,运行再树莓派下面。官方文档没有说自己支持arm,我只有自己打包了,基于官方Github下面的issue打包。
为什么需要这个镜像呢?有这个Docker镜像的话就不用安装一大堆依赖了,代码放在容器环境中可以直接运行,减少了很多运维成本。有些项目的依赖各有各的不同,放在一个宿主机会互相冲突,有了Docker就可以把他们的环境独立出来。
原因可能是官方没有闲工夫做这个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 .
查看一下进行镜像
测试
先在树莓派安装项目:
composer create-project hyperf/hyperf-skeleton
把这个目录映射到容器里面,再到容器里面去运行:
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
完美,证明镜像没问题,如果需要其他PHP扩展就要修改这个Dockerfile文件
上传到阿里云镜像服务存起来
进入阿里云镜像服务,先创建一个镜像仓库
阿里云教程上传镜像:
登录
docker login --username=koala95271 registry.cn-shenzhen.aliyuncs.com
重新打标签
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
完成
分享&总结
分享
把自己的心路历程放在GitHub给要用的人去参考吧:
总结
Dockerfile打包镜像的功能就是构建一个项目的运行环境,我写的Dockerfile还有继续优化的地方,毕竟官方的镜像只有几十M,我打包出来200多M,等待大神答疑解惑。