Dockerfile
FROM php:8.1-alpine
# root 用户
USER root
# 工作目录
WORKDIR /data
# 构建指定参数
# docker build -t webman:v-66 --build-arg USERNAME=www --build-arg USERID=1001 .
# 解决文件挂在容器内外权限不一致问题
# USERNAME 用户名 必须主服务器存在的用户
ARG USERNAME=www
# USERID 用户id 对应的用户id
ARG USERID=1001
# 容器启动命令 常驻后台 start.sh 文件内容如下一行
# cd /data && composer install --optimize-autoloader --no-dev && php start.php start -d && tail -n 1 -f /etc/passwd
COPY ./scripts/start.sh /start.sh
# docker compose exec webman 后面可以跟要在容器内执行的命令 webman 是 docker-compose.yml 文件中 service 下的名称
# restart 命令重启 master 进程以及子进程 docker compose exec webman php start.php restart -d
# reload 命令更新 worker 进程 docker compose exec webman php start.php reload
# composer 命令 composer 包管理相关 docker compose exec webman composer install --optimize-autoloader --no-dev
# composer 包管理 提前下载好指定版本 构建过程中下载非常慢 否则可能一直卡在提示 Downloading..
# 下面的 curl -sS https://getcomposer.org/installer | php 可以不需要 二选一
# https://getcomposer.org/versions 获取所有的 composer 版本
# https://getcomposer.org/download/2.7.9/composer.phar 下载指定版本
COPY ./scripts/composer/2.7.9/composer.phar /usr/local/bin/composer
# 解压php源代码
RUN docker-php-source extract \
# 修改 start.sh 可执行
&& chmod a+x /start.sh \
# 修改镜像地址
&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
# 更新缓存
&& apk update \
# 安装需要的基础包
&& apk add autoconf linux-headers libevent-dev openssl-dev zlib-dev libpng-dev freetype-dev libjpeg-turbo-dev gettext-dev icu-dev libxml2-dev libzip-dev \
# 扩展源代码 下载 pecl 扩展 也可以提前下载好 COPY
&& cd /usr/src/php/ext \
# 下载 event 扩展到扩展源代码目录
&& wget https://pecl.php.net/get/event-3.0.8.tgz && tar xvf event-3.0.8.tgz && mv event-3.0.8 event \
# 下载 redis 扩展到扩展源代码目录
&& wget https://pecl.php.net/get/redis-6.0.2.tgz && tar xvf redis-6.0.2.tgz && mv redis-6.0.2 redis \
# 下载 igbinary 扩展到扩展源代码目录
&& wget https://pecl.php.net/get/igbinary-3.2.12.tgz && tar xvf igbinary-3.2.12.tgz && mv igbinary-3.2.12 igbinary \
# 配置 gd 扩展
&& docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg \
# 安装扩展
&& docker-php-ext-install -j$(nproc) pcntl sockets pdo_mysql gd exif bcmath gettext intl shmop soap sysvsem zip mysqli event redis igbinary \
# 开启 opcache
&& docker-php-ext-enable opcache \
# 重要 配置 event 扩加载顺序 到 sockets 后面 不然会报错 提示找不到 socket 相关函数
&& mv /usr/local/etc/php/conf.d/docker-php-ext-event.ini /usr/local/etc/php/conf.d/docker-php-ext-z1-event.ini \
# 安装 composer 可能非常慢 一直卡在提示 Downloading... 可以 CTRL + C 后重新构建
# && curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer \
# 修改 composer 可执行
&& chmod a+x /usr/local/bin/composer \
# 设置 composer 镜像仓库
&& composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
# 切换到工作目录
&& cd /data \
# 删除 php 源代码
&& docker-php-source delete \
# 创建 www 用户并且指定 用户 id 根据实际情况创建 cat /etc/passwd 查看
&& adduser -u ${USERID} -g "dockerfileuser" -s /bin/sh -D ${USERNAME}
# 切换成 指定 用户
USER ${USERNAME}
# 定义启动脚本
CMD [ "/start.sh" ]
docker-compose.yml
services:
webman:
# 解决容器内网文件权限不一致问题 USERNAME 必须宿主机存在 USERID 是对应的用户id
# docker compose build --build-arg USERNAME=www --build-arg USERID=1001
build:
context: ./
args:
USERNAME: www
USERID: 1001
container_name: container_name_webman
# 每次重新设置镜像版本号可重新构建
image: webman:v-69
# restart 策略 no always on-failure unless-stopped
restart: unless-stopped
volumes:
- ../:/data
ports:
- 127.0.0.1:8979:8787
environment:
TZ: Asia/Shanghai
LANG: en_US.UTF-8
networks:
- networks_webman
logging:
driver: json-file
options:
max-size: 100M
max-file: 30
dns:
- 223.5.5.5
- 223.6.6.6
networks:
networks_webman:
driver: bridge
name: networks_webman
新增安装 pecl 的 event 扩展 redis 扩展
学习一下