0

我在尝试使用 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时,我得到了 site not found 错误。

我认为这可能是防火墙问题,所以我禁用了防火墙,但结果相同。我还通过安装 Tomcat 并启动它来提供几个 HTML 页面来确认。这一切都没有错误。

有人可以建议我可以做一些进一步的调试来实现这个吗?谢谢 ...

4

2 回答 2

1

我启动了一个 CentOS 8 虚拟机来测试这一点,运行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

关键信息是文件中的commandopenmaptiles.conf。让我们尝试手动运行相同的命令:

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目录上收到“权限被拒绝”错误。权限看起来不错:

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。这将阻止容器访问文件系统中没有被明确授予访问权限的部分。

首先,在主机上,让我们验证是否selinuxenforcing模式下运行:

[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


现在我们要做一个决定:

  1. 我们可以永久禁用 selinux,或者
  2. 我们可以更新我们的 selinux 配置以允许当前被拒绝的访问。

我通常会建议(2),但看起来 CentOS 8 中的默认 selinux 策略有一些愚蠢的默认设置,使进程更难(识别问题的审计日志消息被禁用),所以让我们使用(1):

  1. 编辑/etc/selinux/config.

  2. 更改SELINUX=enforcingSELINUX=permissive(允许访问但 selinux 仍处于活动状态并将记录策略违规)或SELINUX=disabled.

  3. 重新启动以确保更改按预期进行。

有了这个改变,我的 CentOS 8 虚拟机现在可以毫无问题地运行切片服务器。

于 2019-11-05T13:06:08.287 回答
1

这是早期帖子的副本,因为没有格式化就无法阅读。它显示了我用来启动 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  
于 2019-11-06T01:54:08.257 回答