通过Docker执行Symfony Demo应用时拒绝权限

时间:2019-07-05 16:02:33

标签: symfony docker

在我第一次尝试通过Docker运行更复杂的应用程序时,我选择了Symfony Demo应用程序,并组装了一个Docker构建结构来容纳它。

  • 第一张图片是httpd:它以root用户身份运行(此后拖放到www-data)并通过“服务器”自定义网络进行通话。
  • 第二个图像是php(fpm):它以root身份运行(此后拖放到www-data),并且还通过“服务器”自定义网络进行通话。
  • 第三个图像是作曲者:它以UID和GID 1000运行。其入口点命令为composer create-project symfony/symfony-demo 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

2 个答案:

答案 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/


用户名称空间解决方案-适用于Debian / Ubuntu主机

Composer应该以用户33(www-data)的身份写入/ app,并且php和httpd放弃特权后也应如此。通过使用user namespaces,我可以保留当前的权限设置(只有所有者可以写)。现在,用户www数据已映射到967及更高范围,这将导致用户33 =我(用户1000)。

现在,所有容器都可以在需要的地方写东西了,我可以以非特权用户的身份编辑项目文件。