Docker php-fpm 8.1写权限被拒绝

dkqlctbz  于 2023-05-05  发布在  PHP
关注(0)|答案(1)|浏览(272)

在Manjaro Linux上,使用相同的Docker配置和php应用程序,我对php能够写入文件没有任何问题。在我的Manjaro框中,当我docker exec -ti my_php_container shls -la我的php应用程序文件有权限1000:1000
但是,在我的Ubuntu 22.04盒子上,当构建docker容器,然后检查容器中的php应用程序文件时,它们的权限是root:root。当php应用程序加载时,所有写功能都被拒绝。PHP is_writable($path)总是返回false,即使chmod 775目录正确。因此,罪魁祸首似乎是Docker没有在容器中正确设置权限。
我的UID和GID在我的Ubuntu盒子上都是1000。这是我目前的设置。我很困惑,Docker通常只是工作,但在我的新Ubuntu框权限被拒绝。为什么容器中的文件不属于1000:1000,即使我创建了这个用户并传入了user数据?
Docker版本23.0.5。注意:我可以运行docker rootless,例如我可以运行docker run hello-world没有问题。当我打开这个php应用程序时,我没有使用sudo,它没有任何错误。Manjaro和Ubuntu都使用相同的Docker版本。

Dockerfile

FROM php:8.1.8-fpm-alpine
ARG UID
ARG GID
ENV UID=${UID}
ENV GID=${GID}

RUN addgroup -g ${GID} --system myname
RUN adduser -G myname --system -D -s /bin/sh -u ${UID} myname

www.conf

[www]
user = myname
group = myname
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 100
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

docker-compose.yml

php:
    container_name: my_php_container
    image: php:8.1.8-fpm
    build:
      dockerfile: Dockerfile
      context: ./server/php-fpm
      args:
        - UID=${UID:-1000}
        - GID=${GID:-1000}
    user:
      "${UID:-1000}:${GID:-1000}"
    environment:
      XDEBUG_SESSION: docker
      CI_ENV: development
    volumes:
      - ./app:/var/www/html
      - ./uploads:/var/www/uploads
9cbw7uwe

9cbw7uwe1#

希望有一个面部表情我可以把这里。当我尝试在不需要sudo的情况下安装docker时,我没有做的一件事是重新启动Ubuntu。我只是签了出去,然后又签了回来。我在upwork上雇了一个很棒的devops家伙,他向我指出我需要“把它关掉再打开”。哈哈

From Docker install instructions:

# For fresh install remove anything old.
sudo apt remove docker docker-engine docker.io containerd runc
sudo apt update
sudo apt install \
    ca-certificates \
    curl \
    gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update

# Install Docker CE
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Run hello world with sudo. Should see hello world results without errors.
sudo docker run hello-world

Post installation steps to run without sudo:

sudo groupadd docker
sudo usermod -aG docker $USER

# Register docker to start on boot.
sudo systemctl enable docker.service
sudo systemctl enable containerd.service

我的关键错误是我假设Ubuntu 22.04将与Manjaro Linux的行为相同。在Manjaro上,注销和重新登录将我的用户注册为docker组的一部分。另一方面,Ubuntu 22.04在我的用户注册为docker组的一部分之前需要完全重启。完全重启后,我可以在没有sudo的情况下运行docker,并且容器中的权限再次正确,我的php应用程序中不再有任何写权限错误。

docker run hello-world

因此,“关闭并再次打开”仍然适用于Linux世界的某些部分。呃。

相关问题