docker 运行 tp 项目权限问题 mkdir(): Permission denied

1. 运行环境

1). Docker 版本

Docker version 23.0.5, build bc4487a

2). 当前使用的 php/php-fpm 版本?

PHP 版本:
PHP 7.3.33 (cli) (built: Mar 17 2022 17:37:44) ( NTS )

php-fpm 版本:
PHP 7.3.33 (cli) (built: Mar 17 2022 17:37:44) ( NTS )

3). 当前系统

ProductName: macOS
ProductVersion: 13.4.1

5). 相关软件版本

nginx version: nginx/1.25.1
tp 版本:v5.1.41

2. 问题描述?

docker 运行 tp 项目权限问题 mkdir(): Permission denied

另外 docker 中 php 日志显示如下错误

docker 运行 tp 项目权限问题 mkdir(): Permission denied

下面是我 PHP 的 Dockerfile 的内容

FROM php:7.3-fpm

ENV TZ Asia/Shanghai
RUN date -R

ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions gd xdebug redis mcrypt memcached swoole
RUN chmod uga+x /usr/local/bin/install-php-extensions && sync && \
    install-php-extensions imagick
RUN docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache

RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba pcntl shmop sysvmsg sysvsem sysvshm
RUN docker-php-ext-install -j$(nproc) mysqli pdo pdo_mysql

CMD ["php-fpm"]

然后我添加了

FROM php:7.3-fpm
RUN usermod -u 1000 xuweidong && usermod -G staff xuweidong

但是 build 的时候提示没有 xuweidong 这个用户,但是我本地用的就是这个用户。

倚南窗以寄傲,审容膝之易安
最佳答案

知道原因了,项目中配置的目录,比如日志、文件,需要在启动容器的时候需要挂载到本地,而且项目配置要写容器中的地址

5个月前 评论
讨论数量: 8

运行容器时尝试添加--privileged参数

8个月前 评论
腹肌会有的 (楼主) 8个月前

容器内的用户和宿主机是通过 UID 来关联的,

RUN usermod -u 1000 xuweidong && usermod -G staff xuweidong

也就是说,xuweidong 并不重要,重要的是 1000。宿主机要有这个 UID 为 1000 的用户,且这个用户对项目有 755 的权限!

比如宿主机有如下用户:

500 xuweidong

同样的,你在 Docker 容器内定义如下:

RUN usermod -u 500 www-data && usermod -G staff  www-data

然后再宿主机中将项目给 xuweidong 这个宿主机账户 755,那么容器内的 www-data 也就是 755 的权限!

我的 Dockerfile 是这样的:

# Configure non-root user.
ARG PUID=1000
ENV PUID ${PUID}
ARG PGID=1000
ENV PGID ${PGID}

RUN groupmod -o -g ${PGID} www-data; \
    usermod -o -u ${PUID} -g www-data www-data
8个月前 评论
腹肌会有的 (楼主) 8个月前
GeorgeKing (作者) 8个月前
yangweijie

www-data用户 一般是指nginx 配的用户吧 一般 nginx配置user 和项目保持一致。

8个月前 评论
腹肌会有的 (楼主) 7个月前

知道原因了,项目中配置的目录,比如日志、文件,需要在启动容器的时候需要挂载到本地,而且项目配置要写容器中的地址

5个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!