我在尝试使用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并启动它来提供几个超文本标记语言页面来确认。这一切都没有错误。
有人能建议我做些进一步的调试来让这一切顺利进行吗?谢谢
这是之前文章的副本,因为没有格式化它是不可读的。它显示了我用来启动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
我启动了一个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服务器。
现在我们要做一个决定:
我通常会建议(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