我正在尝试设置一个简单的网络服务器来显示从我的 NAS 加载的一些图像。我的问题是,我只能让网络服务器显示存储在 Ubuntu 主机上的文件夹中的图像。当尝试从我的 NAS 加载它们时,它们在网页上显示为损坏的文件,但通过在浏览器中输入完整的文件路径直接访问它们时可以访问它们。
该 Web 服务器在 Ubuntu 20.04 主机上的 Docker 中运行。我使用的是httpd Docker 镜像。我的撰写文件如下所示:
version: '3'
services:
httpd:
container_name: webserver-test
image: httpd:2.4.38-alpine
restart: always
# environment:
# - PUID=1000
# - PGID=1000
ports:
- "80:80"
volumes:
- /mnt/744fa3d8-4c42-44fb-90a4-1cec0422ab15/data/containers/webserver-test/public-html/:/usr/local/apache2/htdocs
- /mnt/744fa3d8-4c42-44fb-90a4-1cec0422ab15/data/containers/webserver-test/configuration/:/usr/local/apache2/conf
- /mnt/nas-intern-delt-data/webtest/data/:/usr/local/apache2/htdocs/img
networks:
macvlan0:
ipv4_address: 192.168.10.210
networks:
macvlan0:
external: true
挂载点/mnt/nas-intern-delt-数据像这样安装在 fstab 中,并且可以在 Ubuntu 中浏览而不会出现任何问题:
//192.168.10.100/intern\040delt\040data /mnt/nas-intern-delt-data cifs username=user-here,password=password-here,vers=3.0,dir_mode=0777,file_mode=0777,uid=1000,gid=1000,iocharset=utf8 0 0
我的索引.html看起来像这样
<!DOCTYPE html>
<html>
<head>
<title>Example</title>
</head>
<body>
<p>Hello world!</p>
<img src="/data/1.jpg">
<img src="/img/1.jpg">
</body>
</html>
在查看数据和 img 文件夹从容器内部我看到了这个:
bash-4.4# cd /usr/local/apache2/htdocs
bash-4.4# ls -l
total 16
drwxrwxr-x 2 1000 1000 4096 Feb 10 16:53 data
drwxrwxrwx 2 1000 1000 0 Feb 10 19:29 img
-rwxr-xr-x 1 1000 1000 267 Feb 10 17:17 index.html
drwxrwxr-x 8 1000 1000 4096 Feb 9 20:33 pages
drwxr-xr-x 3 root 1000 4096 Feb 10 17:30 public-html
bash-4.4# cd data
bash-4.4# ls -l
total 100
-rwxr-xr-x 1 1000 1000 98588 Dec 14 16:20 1.jpg
bash-4.4# cd ..
bash-4.4# cd img
bash-4.4# ls -l
total 112
-rwxrwxrwx 1 1000 1000 98588 Dec 14 16:20 1.jpg
-rwxrwxrwx 1 1000 1000 4 Feb 10 19:32 test2.txt
bash-4.4#
浏览网页时,Apache-container日志显示以下内容:
192.168.2.124 - - [21/Feb/2021:15:40:07 +0000] "GET / HTTP/1.1" 304 -
192.168.2.124 - - [21/Feb/2021:15:40:07 +0000] "GET /img/1.jpg HTTP/1.1" 200 98588
网页本身如下所示:imgur-链接
我希望有人能解释一下哪里出了问题。我猜是权限问题,只是我找不到它... 如上所述,它可以正常显示内部保存的图像,但无法显示存储在我的 NAS 中的图像。
提前致谢
答案1
这是我想出的解决方案。
我的示例使用的是图像 wordpress:5.8,但可以应用于任何 php 7.4 apache debian(和其他发行版)图像。使用 docker-compose。
首先,将 CIFS 存储在目标目录之外挂载:
volumes:
repo:
driver_opts:
type: cifs
o: "addr=WINDOWS-SHARE.local,uid=1000,gid=1000,vers=3,username=WindowsUser,password=YourPassword,iocharset=utf8,file_mode=0644,dir_mode=0777"
device: "//WINDOWS-SHARE.local/Repositories/TheFolder"
然后在容器卷中,将其挂载在 /var/www/html 文件夹中,但不是最终路径。
volumes:
- repo:/var/www/html/repo
这就是我使用的入口点和命令:
entrypoint: [ "/bin/sh", "-c" ]
command: >
'
rm -rf /var/www/html/wp-content/themes/theme-name
apt update && apt-get install -y bindfs
mkdir -p /var/www/html/wp-content/themes/theme-name
bindfs -u www-data -g www-data /var/www/html/repo/theme-name /var/www/html/wp-content/themes/theme-name
usermod -u 1000 www-data
groupmod -g 1000 www-data
docker-entrypoint.sh apache2-foreground
'
想法是,删除 docker 文件夹中可能具有相同名称的所有内容。然后安装 bindfs。然后使用刚刚删除的文件夹名称创建一个空目录。接下来,将 repo 中的目录与您创建的文件夹绑定。我通常会将 www-data 用户和组修改为我的用户,以使挂载权限更好地工作,但这可能没有必要。最后,最后一个条目是原始图像的 CMD。
问题在于符号链接与 apache 协同工作的方式。通过使用 bindfs,该问题被掩盖,apache 将文件夹 bind 视为普通文件夹。
编辑:忘记添加,需要将容器设置为特权(privileged: true
)才能使用 bindfs 挂载。