首页 > 解决方案 > Docker 启动 Apache2 并添加挂载点权限

问题描述

我正在为我的 Symfony 应用程序构建一个用于开发目的的图像,但我在正确设置权限时遇到了问题。

这是图像

FROM ubuntu:bionic

EXPOSE 443
ARG USERID

# Install PHP and PHP extensions, httpd
RUN apt-get update && apt-get install -y software-properties-common
RUN LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php && \
     apt-get update && \
     apt-get -y install --no-install-recommends \
     software-properties-common \
     git \
     unzip \
     curl \
     php5.6 \
     apache2 \
     ...

# composer
RUN curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer


COPY ./docker/certificates/. /cert
COPY ./docker/httpd.conf /etc/apache2/sites-available/
COPY ./docker/php5.6-fpm.conf /etc/apache2/conf-available
RUN a2enmod headers \
    && a2enmod ssl \
    && a2enconf php5.6-fpm.conf \
    && a2ensite httpd.conf

# starts apache in foreground
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

这是撰写文件

version: '3'

services:
  mt_symfony:
    container_name: mt_symfony
    build:
      context: ./html
      dockerfile: dev.dockerfile
      args:
        - USERID=${USERID}
    stdin_open: true
    tty: true
    ports:
      - 443:443
    volumes:
      - ./html:/var/www/project

简单地说,我将我的项目目录挂载到/var/www/project. 完成 docker-compose 后,我会转到容器 bash 并composer install手动运行。

问题是 Symfony 不断给我权限错误,它无法创建或写入缓存文件夹。

我尝试添加以下代码(USERID 设置为 1000,这是我的主机用户的 UID)

RUN useradd -u $USERID -d /var/www/project -s /bin/sh local
USER local

但是由于权限错误,Apache2 无法启动。看来 Apache2 只能从root.

基本上我希望能够编辑我通过挂载点共享的代码。

标签: docker

解决方案


好吧,这是你必须忍受的。在开发环境中使用 777 进行 chmoding 非常好。我一直在 var 目录上执行此操作(-R递归地)。我有几十个 dockerized Symfony 应用程序。一旦你有任何根拥有的文件(例如,在 config 目录中,因为 Flex 将它们放在那里,只需 chown 'em 使它们成为你的。这通常是一次性的:chown 1000:1000 config -R在容器中。

APACHE_RUN_USER否则,您可以使用/来运行 Apache 容器APACHE_RUN_GROUP以匹配您的 UID(例如1000)。但是您必须首先在 Dockerfile 中创建用户。尽管如此,Apache 必须以root.

老实说:这个权限问题并没有困扰我。


记得清理你的图像:

# Clean up image
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

总是评论你的Dockerfile,这个文件和其他文件一样是代码,你希望它干净、简洁和维护良好。每一行都应该记录为什么它在那里以及它的作用是什么。


推荐阅读