运行 带有 Podman 的 RHEL 8 上的 OpenMapTiles 服务器
Running OpenMapTilesServer on RHEL8 with Podman
我在使用 Podman 运行 RedHat 8 上尝试 OpenMapTilesServer 时遇到问题。
这是我的启动脚本:
sudo podman run -d -v $(pwd):/data -p 8080:80 docker.io/klokantech/openmaptiles-server
图像拉得不错,似乎开始也不错。
我可以执行
podman ps
并查看容器。一切看起来都很好。如果我使用
查看日志
podman logs <containerID>
我没有看到任何我认为有问题的东西,但是当我尝试访问主页时
http://localhost:8080,然后我收到网站未找到错误。
我以为可能是防火墙的问题,所以我把防火墙关掉了,结果还是一样。我还通过安装 Tomcat 并启动它来为几个 HTML 页面提供服务来确认。这一切都没有错误。
是否有人可以建议我进一步调试以实现此目的?谢谢...
我启动了一个 CentOS 8 VM 来测试这个,运行从你的 post 中执行 podman
命令确实导致失败。今天早上我花了一点时间试图弄清楚发生了什么事。
查看 podman run
的输出,我可以看到以下错误:
[root@localhost data]# podman run --name tiles -v /tmp/data:/data -p 8080:80 docker.io/klokantech/openmaptiles-server
[...]
2019-11-05 12:29:26,812 INFO exited: wizard (exit status 1; not expected)
如果我 podman exec
进入容器,我可以手动 运行 wizard
命令并查看更详细的日志。首先,我们需要找出 wizard
命令所在的位置。由于容器使用 supervisord
作为进程主管,这意味着我们可能需要在 /etc/supervisor
中查看详细信息:
[root@localhost ~]# podman exec -it tiles bash
root@de362646e453:/etc/supervisor# cd /etc/supervisor/
root@de362646e453:/etc/supervisor# ls
conf.d supervisord.conf
root@de362646e453:/etc/supervisor# cd conf.d/
root@de362646e453:/etc/supervisor/conf.d# ls
openmaptiles.conf
root@de362646e453:/etc/supervisor/conf.d# cat openmaptiles.conf
[program:wizard]
command=/bin/bash -c "cd /usr/local/src && node wizard"
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
autostart=true
autorestart=false
startsecs=0
关键信息是openmaptiles.conf
文件中的command
行。让我们尝试 运行手动执行相同的命令:
root@de362646e453:/# cd /usr/local/src/
root@de362646e453:/usr/local/src# node wizard
Starting OpenMapTiles Map Server (action: run)
fs.js:961
return binding.readdir(pathModule._makeLong(path), options.encoding);
^
Error: EACCES: permission denied, scandir '/data'
at Error (native)
at Object.fs.readdirSync (fs.js:961:18)
at Wizard.init (/usr/local/src/wizard/src/main.js:928:19)
at new Wizard (/usr/local/src/wizard/src/main.js:119:8)
at Object.<anonymous> (/usr/local/src/wizard/src/main.js:1270:1)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
/data
目录出现 "permission denied" 错误。权限看起来没问题:
root@de362646e453:/# ls -ld /data
drwxr-xr-x. 2 root root 6 Nov 5 12:08 /data
但是我们无法访问它:
root@de362646e453:/# cd /data
root@de362646e453:/data# ls
ls: cannot open directory '.': Permission denied
如果文件权限看起来没问题,但您仍然无法访问某些内容,这通常意味着是时候查看您的 selinux 配置了。 RHEL(和 CentOS)都默认启用 selinux。这将防止容器访问您的文件系统中未被明确授予访问权限的部分。
首先,在主机上,让我们验证 selinux
在 enforcing
模式下 运行ning:
[root@localhost ~]# getenforce
Enforcing
是(如预期)。让我们将其置于宽容模式,看看是否能解决我们的问题:
[root@localhost ~]# setenforce 0
现在在容器中,让我们尝试再次访问 /data
目录:
[root@localhost ~]# podman exec -it tiles bash
root@de362646e453:/# ls /data
root@de362646e453:/#
太棒了!没有更多的错误。让我们尝试重新启动容器:
[root@localhost data]# podman run --name tiles -v $(pwd):/data -p 8080:80 docker.io/klokantech/openmaptiles-server
/usr/lib/python2.7/dist-packages/supervisor/options.py:298: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
'Supervisord is running as root and it is searching '
2019-11-05 12:37:18,493 CRIT Supervisor running as root (no user in config file)
2019-11-05 12:37:18,493 INFO Included extra file "/etc/supervisor/conf.d/openmaptiles.conf" during parsing
2019-11-05 12:37:18,498 INFO Creating socket tcp://localhost:8081
2019-11-05 12:37:18,500 INFO Closing socket tcp://localhost:8081
2019-11-05 12:37:18,510 INFO RPC interface 'supervisor' initialized
2019-11-05 12:37:18,511 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2019-11-05 12:37:18,511 INFO supervisord started with pid 1
2019-11-05 12:37:19,514 INFO spawned: 'wizard' with pid 8
2019-11-05 12:37:19,516 INFO spawned: 'xvfb' with pid 9
Starting OpenMapTiles Map Server (action: run)
2019-11-05 12:37:19,954 INFO success: wizard entered RUNNING state, process has stayed up for > than 0 seconds (startsecs)
2019-11-05 12:37:19,954 INFO success: xvfb entered RUNNING state, process has stayed up for > than 0 seconds (startsecs)
Config file not found!
Starting installation...
Installation wizard started at http://:::80/
List of available downloads ready.
看起来启动成功了,事实上,我现在可以访问主机端口 8080
上的磁贴服务器了。
现在我们要做出决定:
- 我们可以永久禁用selinux,或者
- 我们可以更新我们的 selinux 配置以允许当前被拒绝的访问。
我通常会建议 (2),但 CentOS 8 中的默认 selinux 策略似乎有一些愚蠢的默认设置,使过程更难(可以识别问题的审计日志消息被禁用),所以让我们开始吧与 (1):
编辑/etc/selinux/config
.
将 SELINUX=enforcing
更改为 SELINUX=permissive
(允许访问但 selinux 仍处于活动状态并将记录违规行为)或 SELINUX=disabled
.
重新启动以确保更改按预期进行。
通过此更改,我的 CentOS 8 VM 现在可以运行 tiles 服务器没有问题。
这是早期 post 的副本,因为如果不进行格式化则无法阅读。它显示了我用来启动 OpenMapTiles-Server 容器的最终启动脚本。
mkdir -p /home/mapprov/Mapping/logs/apt
mkdir -p /home/mapprov/Mapping/logs/supervisor
mkdir -p /home/mapprov/Mapping/logs/nginx
sudo podman run -d \
-v /home/mapprov/Mapping:/data:ro,z \
-v /home/mapprov/Mapping/logs:/var/log:rw,z \
-p 8080:80/tcp \
klokantech/openmaptiles-server
我在使用 Podman 运行 RedHat 8 上尝试 OpenMapTilesServer 时遇到问题。
这是我的启动脚本:
sudo podman run -d -v $(pwd):/data -p 8080:80 docker.io/klokantech/openmaptiles-server
图像拉得不错,似乎开始也不错。 我可以执行
podman ps
并查看容器。一切看起来都很好。如果我使用
查看日志podman logs <containerID>
我没有看到任何我认为有问题的东西,但是当我尝试访问主页时 http://localhost:8080,然后我收到网站未找到错误。
我以为可能是防火墙的问题,所以我把防火墙关掉了,结果还是一样。我还通过安装 Tomcat 并启动它来为几个 HTML 页面提供服务来确认。这一切都没有错误。
是否有人可以建议我进一步调试以实现此目的?谢谢...
我启动了一个 CentOS 8 VM 来测试这个,运行从你的 post 中执行 podman
命令确实导致失败。今天早上我花了一点时间试图弄清楚发生了什么事。
查看 podman run
的输出,我可以看到以下错误:
[root@localhost data]# podman run --name tiles -v /tmp/data:/data -p 8080:80 docker.io/klokantech/openmaptiles-server
[...]
2019-11-05 12:29:26,812 INFO exited: wizard (exit status 1; not expected)
如果我 podman exec
进入容器,我可以手动 运行 wizard
命令并查看更详细的日志。首先,我们需要找出 wizard
命令所在的位置。由于容器使用 supervisord
作为进程主管,这意味着我们可能需要在 /etc/supervisor
中查看详细信息:
[root@localhost ~]# podman exec -it tiles bash
root@de362646e453:/etc/supervisor# cd /etc/supervisor/
root@de362646e453:/etc/supervisor# ls
conf.d supervisord.conf
root@de362646e453:/etc/supervisor# cd conf.d/
root@de362646e453:/etc/supervisor/conf.d# ls
openmaptiles.conf
root@de362646e453:/etc/supervisor/conf.d# cat openmaptiles.conf
[program:wizard]
command=/bin/bash -c "cd /usr/local/src && node wizard"
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
autostart=true
autorestart=false
startsecs=0
关键信息是openmaptiles.conf
文件中的command
行。让我们尝试 运行手动执行相同的命令:
root@de362646e453:/# cd /usr/local/src/
root@de362646e453:/usr/local/src# node wizard
Starting OpenMapTiles Map Server (action: run)
fs.js:961
return binding.readdir(pathModule._makeLong(path), options.encoding);
^
Error: EACCES: permission denied, scandir '/data'
at Error (native)
at Object.fs.readdirSync (fs.js:961:18)
at Wizard.init (/usr/local/src/wizard/src/main.js:928:19)
at new Wizard (/usr/local/src/wizard/src/main.js:119:8)
at Object.<anonymous> (/usr/local/src/wizard/src/main.js:1270:1)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)
/data
目录出现 "permission denied" 错误。权限看起来没问题:
root@de362646e453:/# ls -ld /data
drwxr-xr-x. 2 root root 6 Nov 5 12:08 /data
但是我们无法访问它:
root@de362646e453:/# cd /data
root@de362646e453:/data# ls
ls: cannot open directory '.': Permission denied
如果文件权限看起来没问题,但您仍然无法访问某些内容,这通常意味着是时候查看您的 selinux 配置了。 RHEL(和 CentOS)都默认启用 selinux。这将防止容器访问您的文件系统中未被明确授予访问权限的部分。
首先,在主机上,让我们验证 selinux
在 enforcing
模式下 运行ning:
[root@localhost ~]# getenforce
Enforcing
是(如预期)。让我们将其置于宽容模式,看看是否能解决我们的问题:
[root@localhost ~]# setenforce 0
现在在容器中,让我们尝试再次访问 /data
目录:
[root@localhost ~]# podman exec -it tiles bash
root@de362646e453:/# ls /data
root@de362646e453:/#
太棒了!没有更多的错误。让我们尝试重新启动容器:
[root@localhost data]# podman run --name tiles -v $(pwd):/data -p 8080:80 docker.io/klokantech/openmaptiles-server
/usr/lib/python2.7/dist-packages/supervisor/options.py:298: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
'Supervisord is running as root and it is searching '
2019-11-05 12:37:18,493 CRIT Supervisor running as root (no user in config file)
2019-11-05 12:37:18,493 INFO Included extra file "/etc/supervisor/conf.d/openmaptiles.conf" during parsing
2019-11-05 12:37:18,498 INFO Creating socket tcp://localhost:8081
2019-11-05 12:37:18,500 INFO Closing socket tcp://localhost:8081
2019-11-05 12:37:18,510 INFO RPC interface 'supervisor' initialized
2019-11-05 12:37:18,511 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2019-11-05 12:37:18,511 INFO supervisord started with pid 1
2019-11-05 12:37:19,514 INFO spawned: 'wizard' with pid 8
2019-11-05 12:37:19,516 INFO spawned: 'xvfb' with pid 9
Starting OpenMapTiles Map Server (action: run)
2019-11-05 12:37:19,954 INFO success: wizard entered RUNNING state, process has stayed up for > than 0 seconds (startsecs)
2019-11-05 12:37:19,954 INFO success: xvfb entered RUNNING state, process has stayed up for > than 0 seconds (startsecs)
Config file not found!
Starting installation...
Installation wizard started at http://:::80/
List of available downloads ready.
看起来启动成功了,事实上,我现在可以访问主机端口 8080
上的磁贴服务器了。
现在我们要做出决定:
- 我们可以永久禁用selinux,或者
- 我们可以更新我们的 selinux 配置以允许当前被拒绝的访问。
我通常会建议 (2),但 CentOS 8 中的默认 selinux 策略似乎有一些愚蠢的默认设置,使过程更难(可以识别问题的审计日志消息被禁用),所以让我们开始吧与 (1):
编辑
/etc/selinux/config
.将
SELINUX=enforcing
更改为SELINUX=permissive
(允许访问但 selinux 仍处于活动状态并将记录违规行为)或SELINUX=disabled
.重新启动以确保更改按预期进行。
通过此更改,我的 CentOS 8 VM 现在可以运行 tiles 服务器没有问题。
这是早期 post 的副本,因为如果不进行格式化则无法阅读。它显示了我用来启动 OpenMapTiles-Server 容器的最终启动脚本。
mkdir -p /home/mapprov/Mapping/logs/apt
mkdir -p /home/mapprov/Mapping/logs/supervisor
mkdir -p /home/mapprov/Mapping/logs/nginx
sudo podman run -d \
-v /home/mapprov/Mapping:/data:ro,z \
-v /home/mapprov/Mapping/logs:/var/log:rw,z \
-p 8080:80/tcp \
klokantech/openmaptiles-server