Docker php-apache权限被拒绝



我正在为一个使用apache、php7.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');

问题是来自容器(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 && 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;

在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

希望能帮助你。

最新更新