简体   繁体   English

Docker php apache 权限被拒绝

[英]Docker php apache permission denied

I'm working on configuring a docker setup for an old php project with apache, php 7.2 and mariadb. I'm working on configuring a docker setup for an old php project with apache, php 7.2 and mariadb. After I got the container up and running I get permission denied when I try to write a file from php.在我启动并运行容器后,当我尝试从 php 写入文件时,权限被拒绝。

What is the best approach to solve this?解决这个问题的最佳方法是什么?

docker-compose.yml 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 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 index.php

<?php

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

The problem was that the user from the container (www-root) was different then the user from the host.问题是来自容器(www-root)的用户与来自主机的用户不同。 I added args: uid: ${UID} in the docker-compose file like this:我在 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

in Dockerfile I added ARG uid and RUN usermod -u ${uid} www-data && groupmod -g ${uid} www-data;在 Dockerfile 我添加了ARG uidRUN usermod -u ${uid} www-data && groupmod -g ${uid} www-data; like this:像这样:

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;

In your docker compose file you can to add your local machine user.在您的 docker 撰写文件中,您可以添加本地计算机用户。 First you need check current user id, in my case it is ubuntu:首先你需要检查当前的用户 ID,在我的例子中是 ubuntu:

echo ${UID}

Output: Output:

1001

docker-compose.yml: 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

Hope help you.希望能帮到你。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM