在我第一次尝试通过Docker运行更复杂的应用程序时,我选择了Symfony Demo应用程序,并组装了一个Docker构建结构来容纳它。
composer create-project symfony/symfony-demo symfony-demo
然后我在浏览器中进入localhost:8080,以出现Symfony错误:
The stream or file "/usr/local/apache2/htdocs/symfony-demo/var/log/dev.log" could not be opened: failed to open stream: Permission denied
问题是...提到的该文件甚至在/ var / log /中都不存在。该文件夹为空。
绑定装载中的所有文件都具有1000:1000的权限(我的用户UID / GID),并且其配置如下:-rw-r--r--
。
我尝试将httpd和php运行为:UID 33(www-data)和GID 33; UID 0(根)和GID 33(反之亦然);以及1000:1000或1000:33,但是所有这些组合(当它们成功使httpd / php启动时)都会导致相同的错误。
docker-compose.yml:
version: "3"
services:
httpd:
build: "./httpd/"
container_name: "webserver"
depends_on:
- php
ports:
- "8080:80"
networks:
- server
volumes:
- ../app:/usr/local/apache2/htdocs/
php:
build: "./php/"
depends_on:
- composer
container_name: "php"
networks:
- server
volumes:
- ../app:/usr/local/apache2/htdocs/
composer:
build: "./composer/"
container_name: "composer"
user: "1000:1000"
volumes:
- ../app:/usr/local/apache2/htdocs/
networks:
server:
driver: bridge
composer Dockerfile:
FROM composer:1.8
WORKDIR /usr/local/apache2/htdocs/
CMD ["composer", "create-project", "symfony/symfony-demo", "symfony-demo"]
httpd Dockerfile:
FROM httpd:2.4
COPY ./config/httpd.conf /usr/local/apache2/conf/httpd.conf
COPY ./config/httpd-vhosts.conf /usr/local/apache2/conf/extra/httpd-vhosts.conf
COPY ./config/php-fpm.conf /usr/local/apache2/conf/extra/php-fpm.conf
WORKDIR /usr/local/apache2/htdocs
php Dockerfile:
FROM php:7.3-fpm
RUN cp "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
COPY ./config/timezone.ini $PHP_INI_DIR/conf.d/
COPY ./config/www.conf /usr/local/etc/php-fpm.d/www.conf
RUN apt-get update && \
apt-get install -y libicu-dev
RUN docker-php-ext-install intl
WORKDIR /usr/local/apache2/htdocs
答案 0 :(得分:1)
只授予写权限
chmod -R 777 /usr/local/apache2/htdocs/symfony-demo/var/log/dev.log
此处是symfony文档的文件许可权:https://symfony.com/doc/current/setup/file_permissions.html
答案 1 :(得分:0)
再三考虑:我以前的解决方案(按原样)在RHEL / Fedora / CentOS中不起作用,因为默认情况下www-data不存在,导致Docker无法启动。
为简单起见,我决定简单地编写作曲家的入口点脚本以在/ app中设置-rw-rw ----权限。这样,我可以以用户1000的身份运行composer,并且以相同的PHP组运行(为此专门创建了一个新的用户和组)。现在,PHP可以写入项目内的SQLite3数据库文件,并且作曲者以用户1000的身份进行写入,我可以对其进行编辑。
基本上是@habibun所说的,但我只需要授予组写权限,而不是完全写权限。
请注意,SELinux将拒绝作曲家对您的绑定安装的写访问。您必须将SELinux配置为允许此操作。
这是我存储该项目的资源库,如果您需要参考:https://github.com/o-alquimista/symfony-demo-docker/
Composer应该以用户33(www-data)的身份写入/ app,并且php和httpd放弃特权后也应如此。通过使用user namespaces,我可以保留当前的权限设置(只有所有者可以写)。现在,用户www数据已映射到967及更高范围,这将导致用户33 =我(用户1000)。
现在,所有容器都可以在需要的地方写东西了,我可以以非特权用户的身份编辑项目文件。