【问题标题】:Docker php apache permission deniedDocker php apache权限被拒绝
【发布时间】:2022-01-18 10:18:37
【问题描述】:

我正在为一个带有 apache、php 7.2 和 mariadb 的旧 php 项目配置 docker 设置。在我启动并运行容器后,当我尝试从 php 写入文件时,我的权限被拒绝。

解决这个问题的最佳方法是什么?

docker-compose.yml

version: "3"

networks:
  dirtbike:

services:
  webserver:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: dirtbike-webserver
    restart: 'always'
    depends_on:
      - database
    ports:
      - "80:80"
      - "443:443"
    networks:
      - dirtbike
    volumes:
      - ./public_html:/var/www/html
  database:
    image: mariadb:10.3
    container_name: dirtbike-database
    restart: 'always'
    networks:
      - dirtbike
    ports:
      - "127.0.0.1:3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

Dockerfile

FROM php:7.2-apache-stretch

RUN docker-php-ext-install pdo_mysql

RUN a2enmod ssl && a2enmod rewrite && a2enmod headers
RUN mkdir -p /etc/apache2/ssl
COPY ./Docker/ssl/*.pem /etc/apache2/ssl/

COPY ./Docker/config/apache/dirtbike.conf /etc/apache2/sites-available/000-default.conf

index.php

<?php

file_put_contents(__DIR__.DIRECTORY_SEPARATOR.'test.txt', 'lorem ipsum');

【问题讨论】:

    标签: php docker apache


    【解决方案1】:

    问题是来自容器(www-root)的用户与来自主机的用户不同。 我在 docker-compose 文件中添加了 args:uid: ${UID},如下所示:

    version: "3"
    
    networks:
      dirtbike:
    
    services:
      webserver:
        build:
          context: .
          dockerfile: Dockerfile
          args:
            uid: ${UID}
        container_name: dirtbike-webserver
        restart: 'always'
        depends_on:
          - database
        ports:
          - "80:80"
          - "443:443"
        networks:
          - dirtbike
        volumes:
          - ./public_html:/var/www/html
    

    在 Dockerfile 中,我添加了 ARG uidRUN usermod -u ${uid} www-data &amp;&amp; groupmod -g ${uid} www-data;,如下所示:

    FROM php:7.2-apache-stretch
    
    ARG uid
    
    RUN docker-php-ext-install pdo_mysql
    
    RUN a2enmod ssl && a2enmod rewrite && a2enmod headers
    RUN mkdir -p /etc/apache2/ssl
    COPY ./Docker/ssl/*.pem /etc/apache2/ssl/
    
    COPY ./Docker/config/apache/dirtbike.conf /etc/apache2/sites-available/000-default.conf
    
    RUN usermod -u ${uid} www-data \
        && groupmod -g ${uid} www-data;
    

    【讨论】:

      【解决方案2】:

      在您的 docker compose 文件中,您可以添加本地计算机用户。首先你需要检查当前的用户 id,在我的例子中是 ubuntu:

      echo ${UID}
      

      输出:

      1001
      

      docker-compose.yml:

      webserver:
          build:
            context: .
            dockerfile: Dockerfile
          container_name: dirtbike-webserver
          restart: 'always'
          depends_on:
            - database
          ports:
            - "80:80"
            - "443:443"
          networks:
            - dirtbike
          user: 1001 # local machine user id
          volumes:
            - ./public_html:/var/www/html
      

      希望能帮到你。

      【讨论】:

      • 它不起作用。我得到了同样的结果。
      • @constantin.iordan 请出示您的dirtbike.conf
      • 我找到了解决方案。我在这里发布了答案。
      猜你喜欢
      • 1970-01-01
      • 2014-04-10
      • 2020-06-26
      • 2012-08-13
      • 2023-03-22
      • 2020-07-21
      • 2014-06-29
      相关资源
      最近更新 更多