Rm: не удалось удалить '/var/run/postgresql': Каталог не пуст

После того как диск заполнился и у меня не получилось переместить изображения, я решил удалить всё, запустить новый контейнер Discourse и использовать резервную копию.

Я удалил /var/discourse и выполнил docker system prune -a.

Затем я следовал официальному руководству. Но… что-то не так:

 ./launcher rebuild app
x86_64 arch detected.
Ensuring launcher is up to date
Fordere an von origin
Launcher is up-to-date
2.0.20230222-0048: Pulling from discourse/base
Digest: sha256:XXXX
Status: Image is up to date for discourse/base:2.0.20230222-0048
docker.io/discourse/base:2.0.20230222-0048
/usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2023-03-04T12:04:27.482399 #1]  INFO -- : Reading from stdin
I, [2023-03-04T12:04:27.486188 #1]  INFO -- : > locale-gen $LANG && update-locale
I, [2023-03-04T12:04:28.456925 #1]  INFO -- : Generating locales (this might take a while)...
Generation complete.

I, [2023-03-04T12:04:28.457319 #1]  INFO -- : > mkdir -p /shared/postgres_run
I, [2023-03-04T12:04:28.581975 #1]  INFO -- :
I, [2023-03-04T12:04:28.583082 #1]  INFO -- : > chown postgres:postgres /shared/postgres_run
I, [2023-03-04T12:04:28.588444 #1]  INFO -- :
I, [2023-03-04T12:04:28.588792 #1]  INFO -- : > chmod 775 /shared/postgres_run
I, [2023-03-04T12:04:28.591995 #1]  INFO -- :
I, [2023-03-04T12:04:28.592147 #1]  INFO -- : > rm -fr /var/run/postgresql
rm: cannot remove '/var/run/postgresql': Directory not empty
I, [2023-03-04T12:04:28.616079 #1]  INFO -- :


FAILED
--------------------
Pups::ExecError: rm -fr /var/run/postgresql failed with return #<Process::Status: pid 16 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params "rm -fr /var/run/postgresql"
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.

Кто-нибудь может помочь мне с этим?

Вы остановили старый контейнер?

docker stop app
docker rm app

Что ж, хотя это вполне могло бы быть похоже на меня, на этот раз всё не так просто:

# sudo -s
# cd /var/discourse/
# docker stop app
Ошибка ответа от демона: контейнер app не найден
# docker rm app
Ошибка: контейнер app не найден

Думаю, проблема может быть в том, что я переместил всё из старого расположения по умолчанию образов Docker в новое место, и теперь Docker с Discourse не может получить доступ к файловой системе, которую он ожидает?

/var/run/postgresql не существует.

Не понимаю, почему это перестало работать. :cry:

Как выглядит ваш файл app.yml?

$# cat app.yml
## это шаблон автономного контейнера Docker Discourse «всё в одном»
##
## После внесения изменений в этот файл вы ОБЯЗАНЫ выполнить пересборку:
## /var/discourse/launcher rebuild app
##
## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ И ВЫРАВНИВАНИИ!
## для проверки файла обращайтесь на http://www.yamllint.com/

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"

## какие TCP/IP-порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал один порт с другим веб-сервером, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для деталей
expose:
#  - "7890:80"   # http
#  - "7891:443" # https

labels:
  app_name: discourse
  traefik.enable: true
  traefik.http.routers.discourse.entrypoints: http
  traefik.http.routers.discourse.rule: Host(`talk.spielleiten.de`)      ## Введите здесь ваш домен
  traefik.http.middlewares.discourse-https-redirect.redirectscheme.scheme: https
  traefik.http.routers.discourse.middlewares: discourse-https-redirect
  traefik.http.routers.discourse-secure.entrypoints: https
  traefik.http.routers.discourse-secure.rule: Host(`talk.spielleiten.de`)      ## Введите здесь ваш домен
  traefik.http.routers.discourse-secure.tls: true
  traefik.http.routers.discourse-secure.tls.certresolver: http
  traefik.http.routers.discourse-secure.service: discourse
  traefik.http.services.discourse.loadbalancer.server.port: 80
  traefik.docker.network: proxy

docker_args:
  - "--network=proxy"

networks:
  - proxy

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Установите db_shared_buffers максимум на 25% от общего объема памяти.
  ## будет установлено автоматически при загрузке в зависимости от обнаруженной оперативной памяти, либо вы можете переопределить
  #db_shared_buffers: "256MB"

  ## может улучшить производительность сортировки, но увеличивает использование памяти на соединение
  #db_work_mem: "40MB"

  ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
  #version: tests-passed

env:
  LC_ALL: de_DE.UTF-8
  LANG: de_DE.UTF-8
  LANGUAGE: dn_DE.UTF-8
  EMBER_CLI_PROD_ASSETS: 1
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и количества ядер процессора.
  ## будет установлено автоматически при загрузке в зависимости от обнаруженных процессоров, либо вы можете переопределить
  #UNICORN_WORKERS: 3

  ## TODO: Доменное имя, на которое будет реагировать этот экземпляр Discourse
  ## Обязательно. Discourse не будет работать с чистым IP-адресом.
  DISCOURSE_HOSTNAME: talk.spielleiten.de

  ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
  ## именем хоста (опция -h), что указано выше (по умолчанию "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
  ## при первой регистрации, например 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'XXX'

  ## TODO: SMTP-сервер для проверки новых учетных записей и отправки уведомлений
  ## Адрес SMTP, имя пользователя и пароль обязательны
  ## ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
[удалено по соображениям конфиденциальности]

  ## Адрес CDN http или https для этого экземпляра Discourse (настроен на извлечение)
  ## см. https://meta.discourse.org/t/14857 для деталей
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## Ключ лицензии MaxMind для поиска IP-адресов по геолокации
  ## см. https://meta.discourse.org/t/-/137387/23 для деталей
  DISCOURSE_MAXMIND_LICENSE_KEY: XXX

## Контейнер Docker не имеет состояния; все данные хранятся в /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Плагины размещаются здесь
## см. https://meta.discourse.org/t/19157 для деталей
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Любые пользовательские команды для выполнения после сборки
run:
  - exec: echo "Начало пользовательских команд"
  ## Если вы хотите установить адрес электронной почты 'From' для вашей первой регистрации, раскомментируйте и измените:
  ## После получения первого письма о регистрации закомментируйте строку снова. Она должна выполниться только один раз.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Конец пользовательских команд"

Это работало, пока я не изменил daemon.json:

"data-root": "/srv/new-drive/new-docker-root"

Тогда это ваша проблема. Это проблема Docker, а не Discourse.

Мне кажется, дело в правах доступа или в том, что диск каким-то образом недоступен.

Я так полагаю. Но все остальные сервисы в Docker работают как положено! Просто Discourse не пытается обращаться к новому data-root. Вот почему я надеялся найти решение здесь.

Попробуйте изменить путь для томов на что-то отличное от /var/discourse/shared/standalone.

Предполагаю, вы уже удалили /var/discourse/shared?

Я выполнил команду rm -R /var/discourse и следовал официальному руководству по установке на одном из первых шагов.

Я попробую это!

Я пробовал как директорию на том же диске, так и папку в “data-root” — ничего не изменилось.

Почему команда rm не выполняется? Я предполагаю, что это всё ещё файловая система операционной системы (а не внутри контейнера), и эта операция работает, если я повторяю команду в оболочке.

Полагаю, что команда удаления находится внутри контейнера, который собирается.

Думаю, у меня больше нет идей.

Всё равно огромное спасибо!

Этот каталог сопоставляется с /var/discourse/shared/standalone/postgres_run на хосте.

# ls -lsa /var/discourse/shared/standalone
всего 16
4 drwxr-xr-x 4 root            root             4096 мар  6 08:34 .
4 drwxr-xr-x 3 root            root             4096 мар  6 08:34 ..
4 drwxr-xr-x 3 root            root             4096 мар  6 08:34 log
4 drwxrwxr-x 2 systemd-resolve systemd-timesync 4096 мар  6 08:34 postgres_run
# ls -lsa /var/discourse/shared/standalone/postgres_run/
всего 8
4 drwxrwxr-x 2 systemd-resolve systemd-timesync 4096 мар  6 08:34 .
4 drwxr-xr-x 4 root            root             4096 мар  6 08:34 ..

Это то, что вы ожидаете? df показывает достаточное свободное место, так что проблема не в переполненном диске.

# ./discourse-doctor
DISCOURSE DOCTOR пн 6 мар 18:54:01 CET 2023
OS: Linux dracula 5.4.0-139-generic #156-Ubuntu SMP Fri Jan 20 17:27:18 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux


Найден containers/app.yml

==================== НАСТРОЙКИ YML ====================
[удалено по соображениям конфиденциальности]

==================== ИНФОРМАЦИЯ O DOCKER ====================
ВЕРСИЯ DOCKER: Docker version 20.10.12, build 20.10.12-0ubuntu2~20.04.1

ПРОЦЕССЫ DOCKER (docker ps -a)

CONTAINER ID   IMAGE                                        COMMAND                  СОЗДАН       СТАТУС                 PORTS                                                                      ИМЯ
f6d3f502384f   cthulhoo/ttrss-fpm-pgsql-static:latest       "/opt/tt-rss/updater…"   4 дня назад  Запущен 9 часов назад  9000/tcp                                                                   ttrss-docker_updater_1
fb0c774b31cb   cthulhoo/ttrss-web-nginx:latest              "/docker-entrypoint.…"   4 дня назад  Запущен 9 часов назад (здоров)   127.0.0.1:8280->80/tcp                                                     ttrss-docker_web-nginx_1
83a32795b305   cthulhoo/ttrss-fpm-pgsql-static:latest       "/opt/tt-rss/dcron.s…"   4 дня назад  Запущен 9 часов назад  9000/tcp                                                                   ttrss-docker_backups_1
c211bc93f368   cthulhoo/ttrss-fpm-pgsql-static:latest       "/bin/sh -c ${SCRIPT…"   4 дня назад  Запущен 9 часов назад  9000/tcp                                                                   ttrss-docker_app_1
4ecb89c6bb9f   postgres:12-alpine                           "docker-entrypoint.s…"   4 дня назад  Запущен 9 часов назад  5432/tcp                                                                   ttrss-docker_db_1
c668703d805d   traefik:latest                               "/entrypoint.sh trae…"   4 дня назад  Запущен 9 часов назад  0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   traefik
f67a63243f13   ghcr.io/paperless-ngx/paperless-ngx:latest   "/sbin/docker-entryp…"   4 дня назад  Запущен 9 часов назад (здоров)   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp                                  paperless-web
d2fbf8682efb   postgres:13                                  "docker-entrypoint.s…"   4 дня назад  Запущен 9 часов назад  5432/tcp                                                                   paperless-db
8284f03fdcd0   redis:6.0                                    "docker-entrypoint.s…"   4 дня назад  Запущен 9 часов назад  6379/tcp                                                                   paperless-redis
ab29487743b0   tootsuite/mastodon                           "/usr/bin/tini -- no…"   4 дня назад  Запущен 9 часов назад (здоров)   3000/tcp, 4000/tcp                                                         mastodon_streaming_1
a117f5e785f8   tootsuite/mastodon                           "/usr/bin/tini -- bu…"   4 дня назад  Запущен 9 часов назад (здоров)   3000/tcp, 4000/tcp                                                         mastodon_sidekiq_1
5a4a7e99230c   tootsuite/mastodon                           "/usr/bin/tini -- ba…"   4 дня назад  Запущен 9 часов назад (здоров)   3000/tcp, 4000/tcp                                                         mastodon_web_1
5484d4dd39b6   postgres:14-alpine                           "docker-entrypoint.s…"   4 дня назад  Запущен 9 часов назад (здоров)   5432/tcp                                                                   mastodon_db_1
ecb2e7cbdc0b   redis:7-alpine                               "docker-entrypoint.s…"   4 дня назад  Запущен 9 часов назад (здоров)   6379/tcp                                                                   mastodon_redis_1

c211bc93f368   cthulhoo/ttrss-fpm-pgsql-static:latest       "/bin/sh -c ${SCRIPT…"   4 дня назад  Запущен 9 часов назад  9000/tcp                                                                   ttrss-docker_app_1

Контейнер приложения Discourse запущен


==================== ПЛАГИНЫ ====================
          - git clone https://github.com/discourse/docker_manager.git

Необнаружено неофициальных плагинов.

См. официальный список на https://github.com/discourse/discourse/blob/main/lib/plugin/metadata.rb

========================================
Версия Discourse на talk.spielleiten.de: НЕ НАЙДЕНА
Версия Discourse на localhost: НЕ НАЙДЕНА


==================== ИНФОРМАЦИЯ О ПАМЯТИ ====================
RAM (МБ):

              всего      занято       свободно   совместно    буфер    доступно
Память:        7870        2292         141        4207        5436        1101
Своп:          2047         580        1467

==================== ПРОВЕРКА СВОБОДНОГО МЕСТА НА ДИСКЕ ====================
---------- Место на диске ОС ----------
Файловая система    Размер Использовано Доступно Использовано% Монтировано на
/dev/sda2       109G     68G   36G   66% /
/dev/md0        3,7T    3,1T  581G   85% /mnt/raid

==================== ИНФОРМАЦИЯ О ДИСКАХ ====================
Диск /dev/sda: 111,81 ГиБ, 120034123776 байт, 234441648 секторов
Модель диска: Samsung SSD 840
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: gpt
Идентификатор диска: F889FA6C-2FB7-44B6-8CDF-1E6A05B9E33D

Устройство      Начало        Конец     Сектора   Размер Тип
/dev/sda1     2048   1050623   1048576   512M EFI-система
/dev/sda2  1050624 234440703 233390080 111,3G файловая система Linux


Диск /dev/sdb: 186,32 ГиБ, 200049647616 байт, 390721968 секторов
Модель диска: SAMSUNG HD200HJ
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x13e913e8

Устройство      Загрузка Начало        Конец     Сектора   Размер Код Тип
/dev/sdb1         2048 390721967 390719920 186,3G 83 Linux


Диск /dev/sdc: 1,84 ТиБ, 2000398934016 байт, 3907029168 секторов
Модель диска: SAMSUNG HD203WI
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x00000000

Устройство      Загрузка Начало         Конец       Сектора  Размер Код Тип
/dev/sdc1           63 3907024064 3907024002  1,8T fd Автоопределение RAID Linux


Диск /dev/sde: 1,84 ТиБ, 2000398934016 байт, 3907029168 секторов
Модель диска: SAMSUNG HD203WI
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0x54cd8732

Устройство      Загрузка Начало         Конец       Сектора  Размер Код Тип
/dev/sde1           63 3907024064 3907024002  1,8T fd Автоопределение RAID Linux


Диск /dev/sdd: 1,84 ТиБ, 2000398934016 байт, 3907029168 секторов
Модель диска: SAMSUNG HD203WI
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0xd4a5e07f

Устройство      Загрузка Начало         Конец       Сектора  Размер Код Тип
/dev/sdd1           63 3907024064 3907024002  1,8T fd Автоопределение RAID Linux


Диск /dev/md0: 3,65 ТиБ, 4000792182784 байт, 7814047232 секторов
Единицы: секторы по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер ввода-вывода (минимальный/оптимальный): 65536 байт / 131072 байт

==================== КОНЕЦ ИНФОРМАЦИИ О ДИСКАХ ====================

==================== ГОТОВО! ====================