Ошибки разрешений при "./launcher rebuild app" на чистой установке

Я выполнил:

git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
chmod 700 containers

затем скопировал свой старый файл app.yml в папку containers и попытался пересобрать приложение:


[root@two discourse]# ./launcher rebuild app
x86_64 arch detected.
Ensuring launcher is up to date
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 app
app
2.0.20250722-0020: Pulling from discourse/base
Digest: sha256:3b975c30ef85e9742e2d7f6093450867e67dae204c93d22cc38d043dcbf530b3
Status: Image is up to date for discourse/base:2.0.20250722-0020
docker.io/discourse/base:2.0.20250722-0020
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-09-12T19:05:09.283821 #1]  INFO -- : Reading from stdin
I, [2025-09-12T19:05:09.296585 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown: 
I, [2025-09-12T19:05:09.301579 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2025-09-12T19:05:09.307391 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.313597 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.319914 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.320255 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/15/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.323526 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324153 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324577 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324945 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.325369 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.325759 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.329467 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.330304 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.330761 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.331823 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.332230 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.332621 #1]  INFO -- : > if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi

mkdir: cannot create directory '/shared/postgres_run': Permission denied
chown: cannot access '/shared/postgres_run': No such file or directory
chmod: cannot access '/shared/postgres_run': No such file or directory
mkdir: cannot create directory '/shared/postgres_run': Permission denied
chown: cannot access '/shared/postgres_run/15-main.pg_stat_tmp': No such file or directory
install: cannot change owner and permissions of '/shared/postgres_data': No such file or directory
initdb: error: could not create directory "/shared/postgres_data": Permission denied
find: '/shared/postgres_data': No such file or directory
chown: cannot dereference '/var/run/postgresql': No such file or directory
cat: /shared/postgres_data/PG_VERSION: No such file or directory
du: cannot access '/shared/postgres_data': No such file or directory
/root/upgrade_postgres: line 7: * 2: syntax error: operand expected (error token is "* 2")
I, [2025-09-12T19:05:12.122891 #1]  INFO -- : Generating locales (this might take a while)...
  en_US.UTF-8... done
Generation complete.
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

creating directory /shared/postgres_data ... Upgrading PostgreSQL from version to 15



FAILED
--------------------
Pups::ExecError: if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi
 failed with return #<Process::Status: pid 18 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec failed with the params {"tag"=>"db", "cmd"=>"if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1\nfi\n"}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
c9c7badf83b119a15b40255ae48a05182f72663cc870ca85e867c1f9a218bb83

Похоже, что сразу же внутри контейнера возникла проблема с правами доступа:

mkdir: cannot create directory '/shared/postgres_run': Permission denied

Что может быть причиной этого?

Похоже, мне нужно запускать Docker с флагом --privileged, так как это решает проблему:

./launcher rebuild app --docker-args '--privileged'

Мне не совсем понятно, почему это так. (Это на Fedora 42.) Я бы хотел понять, что здесь происходит.

Потому что в Discourse эти файлы принадлежат root (или родительская директория?).

Возможно, по умолчанию это установлено в Ubuntu. Я не знаю, чем Ubuntu может отличаться.

Вы можете попробовать сделать /var/discourse/shared доступным для записи всеми пользователями и посмотреть, поможет ли это? Или, может быть, проверить, работает ли это сейчас без флага --privileged?

Рекомендуется использовать Ubuntu, а внутри контейнера находится Debian (и, возможно, теперь именно его использует CDCK в качестве основной ОС?). В Fedora много вещей заблокировано, чего нет в Ubuntu. Если вы действительно хотите понять, вам, скорее всего, придётся разбираться в этом самостоятельно, хотя, кажется, я помню, что здесь есть хотя бы один человек, который довольно часто упоминает Fedora CentOS (которая ближе к Fedora, чем Ubuntu!). Возможно, эта ссылка даст подсказки: MKJ's Opinionated Discourse Deployment Configuration

Интересно, какой эффективный UID в тот момент, когда скрипт инициализации пытается создать подкаталоги в /var/discourse/shared; я думал, что это будет root, так как docker запускается от root, но, apparently, нет?

К сожалению, я не нашёл там ничего о использовании --privileged, хотя я разделяю его желание делать всё это с помощью podman вместо docker.

Да, я не пробовал запускать продакшн-версию Discourse на Fedora, только занимался разработкой Discourse на Fedora, и это было не на версии 42. Сейчас мои серверы Discourse работают на AlmaLinux 9, и там мне не нужен параметр --privileged. На моих системах Fedora Docker не установлен.

Я думаю, что попробую определить, каким должен быть владелец этих директорий, не используя --privileged, когда у меня будет время.

Посмотрев на флаг --privileged, я вижу, что он отключает метки процессов SELinux.

Я не отключаю SELinux на своём сервере Discourse и, более того, в моём руководстве есть инструкции по адаптации конфигурации для работы с внешним nginx при включённом SELinux. Вы также можете проверить логи AVC на предмет соответствующих отказов и создать локальную политику с помощью утилиты audit2allow. Однако это может оказаться долгим итеративным процессом. Я бы начал с чистого листа (удалив всё содержимое /var/discourse), чтобы убедиться, что тест валиден, и проверить, нужен ли вам всё ещё флаг --permissive при отключённом SELinux (например, с помощью setenforce 0). Если это сработает, вы сможете использовать audit2allow, так как setenforce 0 всё ещё записывает записи AVC, но уже не блокируется на первом этапе, что позволит вам быстрее получить работающую политику.

Я не думаю, что стал бы использовать --privileged на производственной системе, если бы мог этого избежать.