Dockerfile
FROM php:8.1-alpine
# root 用戶
USER root
# 工作目錄
WORKDIR /data
# 構(gòu)建指定參數(shù)
# docker build -t webman:v-66 --build-arg USERNAME=www --build-arg USERID=1001 .
# 解決文件掛在容器內(nèi)外權(quán)限不一致問題
# USERNAME 用戶名 必須主服務(wù)器存在的用戶
ARG USERNAME=www
# USERID 用戶id 對(duì)應(yīng)的用戶id
ARG USERID=1001
# 容器啟動(dòng)命令 常駐后臺(tái) start.sh 文件內(nèi)容如下一行
# 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 后面可以跟要在容器內(nèi)執(zhí)行的命令 webman 是 docker-compose.yml 文件中 service 下的名稱
# restart 命令重啟 master 進(jìn)程以及子進(jìn)程 docker compose exec webman php start.php restart -d
# reload 命令更新 worker 進(jìn)程 docker compose exec webman php start.php reload
# composer 命令 composer 包管理相關(guān) docker compose exec webman composer install --optimize-autoloader --no-dev
# composer 包管理 提前下載好指定版本 構(gòu)建過程中下載非常慢 否則可能一直卡在提示 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 可執(zhí)行
&& chmod a+x /start.sh \
# 修改鏡像地址
&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
# 更新緩存
&& apk update \
# 安裝需要的基礎(chǔ)包
&& 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 \
# 擴(kuò)展源代碼 下載 pecl 擴(kuò)展 也可以提前下載好 COPY
&& cd /usr/src/php/ext \
# 下載 event 擴(kuò)展到擴(kuò)展源代碼目錄
&& 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 擴(kuò)展到擴(kuò)展源代碼目錄
&& 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 擴(kuò)展到擴(kuò)展源代碼目錄
&& 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 擴(kuò)展
&& docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg \
# 安裝擴(kuò)展
&& 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 擴(kuò)加載順序 到 sockets 后面 不然會(huì)報(bào)錯(cuò) 提示找不到 socket 相關(guān)函數(shù)
&& 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 后重新構(gòu)建
# && curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer \
# 修改 composer 可執(zhí)行
&& chmod a+x /usr/local/bin/composer \
# 設(shè)置 composer 鏡像倉庫
&& composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
# 切換到工作目錄
&& cd /data \
# 刪除 php 源代碼
&& docker-php-source delete \
# 創(chuàng)建 www 用戶并且指定 用戶 id 根據(jù)實(shí)際情況創(chuàng)建 cat /etc/passwd 查看
&& adduser -u ${USERID} -g "dockerfileuser" -s /bin/sh -D ${USERNAME}
# 切換成 指定 用戶
USER ${USERNAME}
# 定義啟動(dòng)腳本
CMD [ "/start.sh" ]
docker-compose.yml
services:
webman:
# 解決容器內(nèi)網(wǎng)文件權(quán)限不一致問題 USERNAME 必須宿主機(jī)存在 USERID 是對(duì)應(yīng)的用戶id
# docker compose build --build-arg USERNAME=www --build-arg USERID=1001
build:
context: ./
args:
USERNAME: www
USERID: 1001
container_name: container_name_webman
# 每次重新設(shè)置鏡像版本號(hào)可重新構(gòu)建
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 擴(kuò)展 redis 擴(kuò)展