当前位置: 首页 > 知识库问答 >
问题:

使用Podman在RHEL8上运行OpenMaptileServer

袁晟
2023-03-14

我在尝试使用Podman在RedHat 8上运行OpenMaptileServer时遇到问题。

这是我的开始脚本:

sudo podman run -d -v $(pwd):/data -p 8080:80 docker.io/klokantech/openmaptiles-server

图像拉得很好,而且开始看起来很好。我可以执行

podman ps 

看看那个容器。一切看起来都很好。如果我用

podman logs <containerID>

我没有看到任何我认为是一个问题,但是当我试图击中主页http://localhost:8080,然后我得到站点未找到的错误。

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

有人能建议我做些进一步的调试来让这一切顺利进行吗?谢谢

共有2个答案

马寒
2023-03-14

这是之前文章的副本,因为没有格式化它是不可读的。它显示了我用来启动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  
李俊雅
2023-03-14

我启动了一个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命令的位置。由于容器使用监督员作为过程监督员,这意味着我们可能需要在/etc/监督员中查看详细信息:

[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文件中的命令行。让我们尝试手动运行相同的命令:

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。这将阻止容器访问文件系统中尚未显式授予访问权限的部分。

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

[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上访问tiles服务器。

现在我们要做一个决定:

  1. 我们可以持续禁用selinux,或

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

>

  • 编辑/etc/selinux/config

    SELINUX=exforcing更改为SELINUX=permissive(允许访问,但SELINUX仍处于活动状态,将记录违反策略的行为)或SELINUX=disabled

    重新启动以确保更改符合预期。

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

  •  类似资料:
    • 我正在运行一些应用程序,其中应用程序必须知道它在PODMAN内部运行,没有任何额外的env变量,但容器中的PODMAN配置必须提供细节,而没有任何用户交互。 现在,我正在使用cat容器内部开始使用podman检查进程是否在容器内部。 有没有更好的方法来处理同样的问题?

    • 使用podman运行postgresql alpine image时: podman run--name postgres-p 5432:5432-ePOSTGRES_PASSWORD=test-ePOSTGRES_USER=test-d postgres: 11-高山 结果是: 错误:/usr/bin/slirp4netns失败:“打开(\“/dev/net/tun\”):没有这样的设备\n警告

    • 1. 总结问题 我正在按照开发人员RedHat的这个简单教程来使一个简单的节点/快速容器正常工作。 我无法让容器在 GCE 上的 CentOS 7 虚拟机下运行。 我有一台 CentOS 7 GCE 虚拟机,我安装了泊坞窗。 我能够成功构建和运行Docker容器,并将它们推送到Google的容器注册表,没有问题。 现在我正在尝试构建podman/buildah容器,并做同样的事情。我已经安装了bu

    • 不同的问题,主要与用户名称空间的数量有关。 尝试运行预构建的映像会产生: 所以我不能真正运行这个东西。然后试图运行一个本地构建的容器,它创建了一个我得到的用户: 已使用subuid设置配置 虽然 所以一定有什么东西我错过了,或者我应该在这里重新开始。即使我再次登录,结果还是一样。所以一定是我做错了什么。

    • 我想运行podman作为运行CI/CD管道的容器。然而,我一直从podman容器中得到这个错误: 我使用Jenkins Kubernetes插件来编写CI/CD管道,这些管道在Kubernetes集群中作为容器运行。我已经成功地编写了使用Docker-in-Docker容器来运行< code>docker build和< code>docker push命令的管道。 然而,在容器中运行Docker

    • 我使用R命令安装了h2o。这促使我安装了Java的最新版本:版本16。一切都运行得很好——除了在发布时,h2o会唠叨我从h2o.ai网站安装最新版本的h2o,因为用CRAN下载打包的版本已经过时5个月了。 当我下载h2o版本3.32.0.5时,我无法用:我收到消息“仅支持Java 8…14,系统版本为16”。 Java14被列为有安全缺陷,所以我不想从Java16降级;相反,我想恢复到以前版本的h