docker - 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
.
基本上我希望能够编辑我通过挂载点共享的代码。
解决方案
好吧,这是你必须忍受的。在开发环境中使用 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
,这个文件和其他文件一样是代码,你希望它干净、简洁和维护良好。每一行都应该记录为什么它在那里以及它的作用是什么。
推荐阅读
- php - 在 CodeIgniter 中检索单行作为 EAV 模型的查询结果
- javascript - 是否可以通过 vue 中的另一个函数模拟单击路由器链接元素
- java - JavaFX 是公共 API 的一部分吗?
- javascript - 如何获取表格的单元格索引?
- python - 无法在 jupyter notebook 中使用 mysql.connector 8.0 以正确的语法执行查询
- python - Tensorflow:将不同的函数映射应用于 tf 数组的不同轴?
- mysql - 检查与您的 MySQL 服务器版本相对应的手册,以了解在 ''execute_transaction'(IN sql_text VARCHAR(8000)) 附近使用的正确语法
- android - 如何从 adb shell 触发“Ok google”?
- c# - Application.DoEvents() 是多任务处理的一种形式吗?
- vba - 在括号中查找文本并更改某些匹配项