Я развернул виртуальную машину 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
Ключевой информацией является строка command
в 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
работает в режиме enforcing
:
[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), но похоже, что политика selinux по умолчанию в CentOS 8 имеет некоторые глупые значения по умолчанию, которые усложняют процесс (сообщения журнала аудита, которые идентифицируют проблему, отключены), поэтому давайте перейдем к (1):
Редактировать /etc/selinux/config
.
Изменить SELINUX=enforcing
на SELINUX=permissive
(разрешает доступ, но selinux все еще активен ибудет регистрировать нарушения политики) или SELINUX=disabled
.
Перезагрузиться, чтобы убедиться, что изменение остается в ожидаемом состоянии.
С этим изменением мой CentOS8 ВМ теперь может без проблем запускать сервер плиток.