Ana*_*k B 11 php nginx laravel docker docker-compose
我有两个docker容器:Nginx和App.
app容器扩展了PHP-fpm并且还有我的Laravel代码.
在我的docker-compose.yml工作中:
version: '2'
services:
nginx:
build:
context: ./nginx
dockerfile: ./Dockerfile
ports:
- "80:80"
links:
- app
app:
build:
context: ./app
dockerfile: ./Dockerfile
Run Code Online (Sandbox Code Playgroud)
在我的Nginx Dockerfile中,我正在做:
FROM nginx:latest
WORKDIR /var/www
ADD ./nginx.conf /etc/nginx/conf.d/default.conf
ADD . /var/www
EXPOSE 80
Run Code Online (Sandbox Code Playgroud)
在我的App Dockerfile中,我正在做:
FROM php:7-fpm
WORKDIR /var/www
RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client && docker-php-ext-install mcrypt pdo_mysql
ADD . /var/www
Run Code Online (Sandbox Code Playgroud)
在成功运行docker-compose之后,当我尝试localhost时出现以下错误
无法打开流或文件"/var/www/storage/logs/laravel.log":无法打开流:权限被拒绝
根据我的理解,存储文件夹需要由Web服务器写入.
我应该怎么做才能解决这个问题?
viv*_*d4v 21
使你的Dockerfile如下 -
FROM php:7-fpm
WORKDIR /var/www
RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client && docker-php-ext-install mcrypt pdo_mysql
ADD . /var/www
RUN chown -R www-data:www-data /var/www
Run Code Online (Sandbox Code Playgroud)
这使得目录/var/www所拥有的www-data是默认用户php-fpm.
因为它是用户编译的www-data.
REF-
我发现了类似的问题,我修复了它
chown -R www-data:www-data /var/www
chmod -R 755 /var/www/storage
Run Code Online (Sandbox Code Playgroud)
我尝试了所有这些,但没有成功。我的 Laravel 存储文件夹具有访问权限。但/var/www/storage还是没有得到许可。
在阅读了多个建议后,尤其是这个。我执行了以下操作(请注意,这php是我的容器映像的名称,并且我将我的 laravel 项目直接链接到/var/www):
docker-compose exec php ls -al /var/www/storage
root访问权限,但我需要www-data访问权限。docker-compose exec php chown -R $USER:www-data /var/www/storage
www-data访问存储文件夹docker-compose exec php chown -R $USER:www-data /var/www/bootstrap/cache
www-data访问 bootstrap/cache 文件夹如果您再次运行第 1 项,www-data应该可以访问,并且您的 Laravel 应用程序应该没问题。
小智 7
您需要创建一个与您计算机上的用户(您用来创建项目文件的用户)相匹配的用户。因此,在应用程序 Dockerfile 中,像这样更改文件:
FROM php:fpm
# Arguments defined in docker-compose.yml
ARG user
ARG uid
# Install system dependencies
RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client
# Install PHP extensions
RUN docker-php-ext-install mcrypt pdo_mysql
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user
# Set working directory
WORKDIR /var/www
# Set the user
USER $user
# Copy your files
COPY . . # You can use "." as a destination since you already changed the workdir
Run Code Online (Sandbox Code Playgroud)
快速注意:如果您纯粹使用 docker 进行本地开发,则无需复制任何内容,只需使用绑定挂载即可。
在 docker-compose 文件中进行以下更改:
app:
build:
args:
user: essana3 # your username on your machine, you can get it by running echo $USER
uid: 1000 # your uid which you can get by running id -u
context: ./app
dockerfile: Dockerfile # if your dockerfile is called Dockerfile, you don't need to add the dockerfile option
volumes:
- ./app:/var/www
Run Code Online (Sandbox Code Playgroud)
奖励:您可以使用上面的 dockerfile 在 docker-compose 文件中创建实用程序容器来运行 artisan 和composer 命令:
composer:
build:
args:
user: essana3 # your username (echo $USER)
uid: 1000 # your uid (id -u)
context: ./app
working_dir: /var/www
volumes:
- ./app:/var/www
entrypoint: ['composer']
artisan:
build:
args:
user: essana3 # your username (echo $USER)
uid: 1000 # your uid (id -u)
context: ./app
working_dir: /var/www
volumes:
- ./app:/var/www
entrypoint: ['php', 'artisan']
Run Code Online (Sandbox Code Playgroud)
我可以使用/使用时做三件事
storage文件夹(sudo chmod 777 storage/ storage/*)RUN chown -R www-data:www-data /var/www
RUN chmod 755 /var/www
将/home不需要特殊权限的项目文件夹移动到该目录上(需要我个人推荐)(在我使用的我的文件夹中,所有这些文件夹/home/projects/都放置在该文件夹中)。
注意:如果项目在中,/var/www/那么如果您编写了文件上传,则也需要该文件夹的权限。当您将其移动到/home
在Docker中使用绑定安装时,Docker主机中的原始权限保留在容器中。这使我们能够在Docker主机上设置适当的权限,以在容器内使用。
首先,您应该找到nginx 的uid和gid,例如:
docker-compose exec nginx id www-data
该命令的输出将如下所示:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
然后,您应该使用它们uid并gid在Docker主机上设置权限,该权限也将由容器使用。因此,在Docker主机上运行以下命令:
sudo chown -R 33:33 site
现在一切都必须正常工作。
| 归档时间: |
|
| 查看次数: |
26588 次 |
| 最近记录: |