From e5cbb48bcc05f636ed682dc9e62e218b9a4bc3c9 Mon Sep 17 00:00:00 2001 From: augushong Date: Wed, 9 Sep 2026 14:45:21 +0000 Subject: [PATCH] =?UTF-8?q?fix(stack):=20=E5=BC=80=E5=8F=91=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E7=A7=BB=E9=99=A4VOLUME=E6=B6=88=E9=99=A4runtime?= =?UTF-8?q?=E9=81=AE=E8=94=BD=EF=BC=8Crun.sh=E6=9D=83=E9=99=90=E4=B8=8Esu?= =?UTF-8?q?=E5=86=99=E6=B3=95=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docker-dev/docker-dev-sync 删除 4 行 VOLUME:匿名卷会遮蔽整目录 bind mount 的宿主 runtime(已实证:宿主看不到容器日志) - run.sh 统一四目录 777 + umask + 正确 su 写法(-s /bin/sh,www-data 为 nologin) - serve/full/author 生产模式 VOLUME 保留作 docker run -v 兜底 --- source/stack/author/source/docker/run.sh | 5 +++-- source/stack/docker-dev-sync/Dockerfile | 6 ++---- source/stack/docker-dev-sync/source/docker/run.sh | 4 ++-- source/stack/docker-dev/Dockerfile | 9 ++------- source/stack/docker-dev/source/docker/run.sh | 5 +++-- source/stack/docker-serve/source/docker/run.sh | 5 +++-- source/stack/full/source/docker/run.sh | 5 +++-- 7 files changed, 18 insertions(+), 21 deletions(-) diff --git a/source/stack/author/source/docker/run.sh b/source/stack/author/source/docker/run.sh index c7630eb..c94bee4 100644 --- a/source/stack/author/source/docker/run.sh +++ b/source/stack/author/source/docker/run.sh @@ -29,8 +29,9 @@ echo "参数为:$@" # TODO:增加自动批量运行并阻塞的脚本,比如:group default ,会调用auto.sh的default的部分,最终阻塞,auth.sh的default部分,可能会运行一系列的命令,比如清空缓存,踢人下线,重置密码 if [ "$1" = "server" ] || [ "$1" = "" ]; then - # 运行定时任务 TODO:以指定用户运行 - su - www-data -c "nohup php /var/www/html/think timer --local --quiet &" + # 运行定时任务(以 www-data 运行;www-data 是 nologin 账户,必须 -s /bin/sh 覆盖 shell,用户名放最后) + # 注意不要写成 su -www-data(会被解析为 -w 选项导致以 root 运行)或 su - www-data(nologin 直接报错) + su -s /bin/sh -c "nohup php /var/www/html/think timer --local --quiet &" www-data # 运行nginx service nginx start # 运行php-fpm diff --git a/source/stack/docker-dev-sync/Dockerfile b/source/stack/docker-dev-sync/Dockerfile index ea4154b..f9e402d 100644 --- a/source/stack/docker-dev-sync/Dockerfile +++ b/source/stack/docker-dev-sync/Dockerfile @@ -84,10 +84,8 @@ COPY source/stack/docker-dev-sync/source/docker/zzz-xdebug.ini /usr/local/etc/ph # Create source mount point (host code staging area) RUN mkdir -p /var/www/source -VOLUME /var/www/html/runtime -VOLUME /var/www/html/public/storage -VOLUME /var/www/html/public/build -VOLUME /var/www/html/storage +# 同步模式:代码 rsync 到容器本地,runtime 由 run.sh 启动时 chmod 777 重建, +# sync.sh 已排除 runtime;匿名卷在容器重建后并不延续,故不声明 VOLUME # Expose Nginx port EXPOSE 8000 diff --git a/source/stack/docker-dev-sync/source/docker/run.sh b/source/stack/docker-dev-sync/source/docker/run.sh index 6edf195..0098153 100644 --- a/source/stack/docker-dev-sync/source/docker/run.sh +++ b/source/stack/docker-dev-sync/source/docker/run.sh @@ -67,8 +67,8 @@ mkdir -p /var/www/html/runtime/nginx && chmod 777 /var/www/html/runtime/nginx echo "参数为:$@" if [ "$1" = "server" ] || [ "$1" = "" ]; then - # Run timer (background) - su -www-data -c "nohup php /var/www/html/think timer --local --quiet &" + # Run timer (background, as www-data; nologin account requires -s /bin/sh with username last) + su -s /bin/sh -c "nohup php /var/www/html/think timer --local --quiet &" www-data # Run nginx service nginx start # Run php-fpm (foreground, keeps container alive) diff --git a/source/stack/docker-dev/Dockerfile b/source/stack/docker-dev/Dockerfile index 3afa085..c43125c 100644 --- a/source/stack/docker-dev/Dockerfile +++ b/source/stack/docker-dev/Dockerfile @@ -84,13 +84,8 @@ RUN echo 'auto_prepend_file = /opt/xhprof/xhprof-bootstrap.php' > /usr/local/etc COPY source/stack/docker-dev/source/docker/zzz-dev.ini /usr/local/etc/php/conf.d/zzz-dev.ini COPY source/stack/docker-dev/source/docker/zzz-xdebug.ini /usr/local/etc/php/conf.d/zzz-xdebug.ini -VOLUME /var/www/html/runtime -VOLUME /var/www/html/public/storage -VOLUME /var/www/html/public/build -VOLUME /var/www/html/storage - -# Mount main directory, alternatively mount the main directory directly and remove the specific volumes above -# VOLUME ["/var/www/html"] +# 开发模式整目录 bind mount:子路径 VOLUME 匿名卷会遮蔽宿主 runtime 等目录, +# 权限与持久化由 run.sh 启动时 chmod 777 + 宿主目录直接承担,故不声明 VOLUME # Expose Nginx port EXPOSE 8000 diff --git a/source/stack/docker-dev/source/docker/run.sh b/source/stack/docker-dev/source/docker/run.sh index 57ba496..9b2e5bb 100644 --- a/source/stack/docker-dev/source/docker/run.sh +++ b/source/stack/docker-dev/source/docker/run.sh @@ -47,8 +47,9 @@ echo "参数为:$@" # TODO:增加自动批量运行并阻塞的脚本,比如:group default ,会调用auto.sh的default的部分,最终阻塞,auth.sh的default部分,可能会运行一系列的命令,比如清空缓存,踢人下线,重置密码 if [ "$1" = "server" ] || [ "$1" = "" ]; then - # 运行定时任务 TODO:以指定用户运行 - su -www-data -c "nohup php /var/www/html/think timer --local --quiet &" + # 运行定时任务(以 www-data 运行;www-data 是 nologin 账户,必须 -s /bin/sh 覆盖 shell,用户名放最后) + # 注意不要写成 su -www-data(会被解析为 -w 选项导致以 root 运行)或 su - www-data(nologin 直接报错) + su -s /bin/sh -c "nohup php /var/www/html/think timer --local --quiet &" www-data # 运行nginx service nginx start # 运行php-fpm diff --git a/source/stack/docker-serve/source/docker/run.sh b/source/stack/docker-serve/source/docker/run.sh index fe2324c..2d5fc0a 100644 --- a/source/stack/docker-serve/source/docker/run.sh +++ b/source/stack/docker-serve/source/docker/run.sh @@ -36,8 +36,9 @@ echo "参数为:$@" # TODO:增加自动批量运行并阻塞的脚本,比如:group default ,会调用auto.sh的default的部分,最终阻塞,auth.sh的default部分,可能会运行一系列的命令,比如清空缓存,踢人下线,重置密码 if [ "$1" = "server" ] || [ "$1" = "" ]; then - # 运行定时任务 TODO:以指定用户运行 - su - www-data -c "nohup php /var/www/html/think timer --local --quiet &" + # 运行定时任务(以 www-data 运行;www-data 是 nologin 账户,必须 -s /bin/sh 覆盖 shell,用户名放最后) + # 注意不要写成 su -www-data(会被解析为 -w 选项导致以 root 运行)或 su - www-data(nologin 直接报错) + su -s /bin/sh -c "nohup php /var/www/html/think timer --local --quiet &" www-data # 运行nginx service nginx start # 运行php-fpm diff --git a/source/stack/full/source/docker/run.sh b/source/stack/full/source/docker/run.sh index fe2324c..2d5fc0a 100644 --- a/source/stack/full/source/docker/run.sh +++ b/source/stack/full/source/docker/run.sh @@ -36,8 +36,9 @@ echo "参数为:$@" # TODO:增加自动批量运行并阻塞的脚本,比如:group default ,会调用auto.sh的default的部分,最终阻塞,auth.sh的default部分,可能会运行一系列的命令,比如清空缓存,踢人下线,重置密码 if [ "$1" = "server" ] || [ "$1" = "" ]; then - # 运行定时任务 TODO:以指定用户运行 - su - www-data -c "nohup php /var/www/html/think timer --local --quiet &" + # 运行定时任务(以 www-data 运行;www-data 是 nologin 账户,必须 -s /bin/sh 覆盖 shell,用户名放最后) + # 注意不要写成 su -www-data(会被解析为 -w 选项导致以 root 运行)或 su - www-data(nologin 直接报错) + su -s /bin/sh -c "nohup php /var/www/html/think timer --local --quiet &" www-data # 运行nginx service nginx start # 运行php-fpm