[英]docker apache volume not working properly
version: "3.8"
networks:
frontend:
backend:
services:
apache:
container_name: apache
build: ./docker/apache/
ports:
- "8001:80"
volumes:
- ./src:/usr/local/apache2/htdocs
networks:
- frontend
- backend
php:
container_name: php
build: ./docker/php
ports:
- "9001:9000"
volumes:
- ./src:/usr/local/apache2/htdocs
working_dir: /usr/local/apache2/htdocs
networks:
- backend
apache.conf
LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so
<VirtualHost *:80>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/usr/local/apache2/htdocs/$1
DocumentRoot /usr/local/apache2/htdocs
<Directory /usr/local/apache2/htdocs/public>
Options -Indexes +FollowSymLinks
DirectoryIndex index.php
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
如您所見,項目文件夾目錄。 當嘗試訪問 http://localhost:8002/ 時,它不會在瀏覽器索引中顯示公用文件夾。
找不到更改 apache.conf 文件中的目錄路徑時。 瀏覽器上顯示錯誤消息
<Directory /usr/local/apache2/htdocs/public>
PHP Docker 文件
FROM php:8.1-fpm
COPY php.ini /usr/local/etc/php/conf.d/php.ini
RUN apt-get update \
&& apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev \
&& docker-php-ext-install pdo
阿帕奇 Dockerfile
FROM httpd:2.4.51
COPY apache.conf /usr/local/apache2/conf/apache.conf
RUN echo "Include /usr/local/apache2/conf/apache.conf" \
>> /usr/local/apache2/conf/httpd.conf
由於所有其他文件都顯示出來,因此很可能是權限問題。 您的public
目錄可能由主機系統上的apache
或http
或www-data
用戶擁有,並且該用戶的uid
和/或gid
與容器內使用的內容不匹配。 您可以像這樣找出主機用戶的ID...
首先,確定正確的用戶名:
ls -l ./src/public
然后獲取該用戶的uid
:
id -u www-data
和gid
:
id -g www-data
最后,將以下行附加到您的 apache Dockerfile
中,將ARG
值替換為上述命令的結果:
ARG UID=33
ARG GID=33
RUN usermod -u ${UID} www-data \
&& usermod -g ${GID} www-data \
&& chown -hR www-data:www-data /usr/local/apache2
您使用的官方httpd
映像以用戶www-data
身份運行,因此不要在usermod
命令中更改它,我們只是更改容器中現有用戶的 ID 以匹配您的主機系統。
為了使這更靈活/便攜,您還可以從您的撰寫文件中傳遞值。
為了快速而骯臟的修復,只需在主機上執行chmod -R a+r ./src/public
。 這可能會起作用,但不太安全。 但是,如果您只是在進行測試或僅設置此項目供個人使用,那么這可能是最簡單的解決方案。
對於測試,請在 docker docker run
上嘗試使用完整路徑作為源的--mount
語法:
--mount type=bind,source=/path/to/src,target=/usr/local/apache2/htdocs
^^^^^^^^^^^^
它指定一個綁定掛載,這意味着主機上的文件或目錄被掛載到容器中。
還要docker inspect yourContainer
的輸出,以查看已設置的卷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.