LINUX.ORG.RU
решено ФорумAdmin

docker-compose - как выполнить команду после старта контейнера, не прерывая entrypoint?

 ,


0

2

Есть nextcloud.

Нужно после его старта выполнить внутри контейнера bash-команду.

Есть ли возможность? Читал, что можно настроить

volumes:
    - ./db-init-scripts:/docker-entrypoint-initdb.d

И внутри поместить баш-скрипт. Но это ручная настройки. Её нужно поставлять вне docker-compose.yaml.

★★★★★

Делов-то, заверни докер в докер и поставляй с готовым правильным docker-compose.yaml.

Anoxemian ★★★★★
()
Ответ на: комментарий от abcq

Я так понял, что нужно поймать момент старта или контейнера или самого некстклауда. А это костыли, хуков то нет.

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

эээ, а то я думаю шо эт вдруг ентрипоинты городить…

ну тоды, вот ишью для некстклауда с кучкой разных вариантов и ситуацией похожей https://github.com/nextcloud/docker/issues/820

abcq ★★
()
Последнее исправление: abcq (всего исправлений: 2)
Ответ на: комментарий от abcq

Как ты угадал проблему? :)

Да, проблема в том, что как бы я не понаставил приложухи в некстклауд, а после рестарта они как бы выключены (или вообще не проинсталлированны).

Возникла мысль как-то запустить скрипт после запуска клауда.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

они как бы выключены (или вообще не проинсталлированны)

А чего на хост не вынести каталог некстклауда? Он же по сути stateful-приложение.

Что они сами, кстати, и советуют делать при запуске в контейнере.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 2)

Можно завернуть up и exec в скрипт с паузой между ними. Костыли-костылики.

А каким образом там настройки установленных приложений хранятся? Может, подмонтировать том в нужное место, где состояние лежит, которое при рестарте пропадает?

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от vvn_black
$ cat docker-compose.yaml
version: '3.7'

networks:
  nextcloud:
    external: true

services:

  nextcloud:
#    image: nextcloud:23.0.3-apache
    build: ./src/
    container_name: nextcloud
    environment:
      - TZ=Europe/Moscow
      - POSTGRES_HOST=postgres-nextcloud
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=nextcloud
      - POSTGRES_PASSWORD=dsfjhskdjfhskWER!
    volumes:
      - ./nextcloud/apps:/var/www/html/apps
      - ./nextcloud/config:/var/www/html/config
      - ./nextcloud/data:/var/www/html/data
    networks:
      - nextcloud
    restart: unless-stopped
    depends_on:
      - postgres-nextcloud


  postgres-nextcloud:
    image: postgres:14.1-alpine
    container_name: postgres-nextcloud
    restart: unless-stopped
    environment:
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=nextcloud
      - POSTGRES_PASSWORD=dsfjhskdjfhskWER!
    volumes:
      - ./database:/var/lib/postgresql/data
    networks:
      - nextcloud


я монтирую, да.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от Nervous

Я щас примерно такое замутил, только заэкстендился от их контейнера.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

я монтирую, да

Тогда не должно быть проблем с «а после рестарта они как бы выключены (или вообще не проинсталлированны)».

vvn_black ★★★★★
()

@Nervous @vvn_black

В общем. Проблема частично описана в https://github.com/nextcloud/docker/issues/820 , частично в https://github.com/nextcloud/server/issues/1599

Звучит так: после перезапуска контейнера клауда все приложения, которые я понаставил и понастроил, они все слетают. Видятся как «установлено», но ни в меню сверху нет, ни при открытии урла приложения /app/calendar (например) - не работают (редиректят на дашборд).

Я подумал, что можно тупо перещёлкнуть приложения - выкл + вкл.

Но не тут-то было, оказывается.

Смастерил свой контейнер. (композ выше)

$ cat Dockerfile 
FROM nextcloud:23.0.3-apache

WORKDIR /var/www/html

COPY ./script/enable-apps.sh /docker-entrypoint-initdb.d/enable-apps.sh

RUN chmod u+x /docker-entrypoint-initdb.d/enable-apps.sh

ENTRYPOINT ["/entrypoint.sh"]
CMD ["apache2-foreground"]

А скрипт вот такой.

$ cat script/enable-apps.sh
#!/bin/bash

run_as() {
    if [ "$(id -u)" = 0 ]; then
        su -p www-data -s /bin/sh -c "$1"
    else
        sh -c "$1"
    fi
}

while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' localhost:80/index.php/login)" != "200" ]]; do sleep 5; done

run_as ' \
for app in $(ls /var/www/html/apps/); do \
    echo "Disabling $app..."
    php /var/www/html/occ app:disable $app
    echo "Installing $app..."
    php /var/www/html/occ app:install $app
    echo "Enabling $app..."
    php /var/www/html/occ app:enable $app 
done'

Вот тут https://stackoverflow.com/a/43975603/2798461 было написано, что есть спец дира, из которой запускаются скрипты после старта - не могу удостовериться.

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

Есть мысли?

bvn13 ★★★★★
() автор топика
Последнее исправление: bvn13 (всего исправлений: 1)
Ответ на: комментарий от vvn_black

так… щас глянул,а в списке приложух нет тех, что я ставлю - тот же календарь или почтовое, или онлиофис… а куда оно сохраняется тогда?

$ ls -la
\total 192
drwxr-xr-x 48 www-data root 4096 Mar 24 20:01 .
drwxr-xr-x  5 root     root 4096 Mar 31 14:25 ..
drwxr-xr-x 11 www-data root 4096 Mar 24 20:00 accessibility
drwxr-xr-x 11 www-data root 4096 Mar 31 20:04 activity
drwxr-xr-x  6 www-data root 4096 Mar 24 20:00 admin_audit
drwxr-xr-x 12 www-data root 4096 Mar 31 20:04 circles
drwxr-xr-x  6 www-data root 4096 Mar 31 20:04 cloud_federation_api
drwxr-xr-x  8 www-data root 4096 Mar 31 20:04 comments
drwxr-xr-x  6 www-data root 4096 Mar 24 20:00 contactsinteraction
drwxr-xr-x  9 www-data root 4096 Mar 24 20:00 dashboard
drwxr-xr-x 10 www-data root 4096 Mar 24 20:00 dav
drwxr-xr-x 10 www-data root 4096 Mar 24 20:00 encryption
drwxr-xr-x 10 www-data root 4096 Mar 24 20:00 federatedfilesharing
drwxr-xr-x 10 www-data root 4096 Mar 24 20:00 federation
drwxr-xr-x 11 www-data root 4096 Mar 31 20:04 files
drwxr-xr-x 11 www-data root 4096 Mar 31 20:04 files_external
drwxr-xr-x  8 www-data root 4096 Mar 31 20:04 files_pdfviewer
drwxr-xr-x  8 www-data root 4096 Mar 31 20:04 files_rightclick
drwxr-xr-x 10 www-data root 4096 Mar 31 20:04 files_sharing
drwxr-xr-x  9 www-data root 4096 Mar 31 20:04 files_trashbin
drwxr-xr-x  8 www-data root 4096 Mar 24 20:00 files_versions
drwxr-xr-x  7 www-data root 4096 Mar 31 20:04 files_videoplayer
drwxr-xr-x  9 www-data root 4096 Mar 31 20:04 firstrunwizard
drwxr-xr-x 12 www-data root 4096 Mar 31 20:04 logreader
drwxr-xr-x  6 www-data root 4096 Mar 24 20:00 lookup_server_connector
drwxr-xr-x  8 www-data root 4096 Mar 31 20:04 nextcloud_announcements
drwxr-xr-x 10 www-data root 4096 Mar 31 20:04 notifications
drwxr-xr-x  8 www-data root 4096 Mar 24 20:00 oauth2
drwxr-xr-x  9 www-data root 4096 Mar 31 20:04 password_policy
drwxr-xr-x 10 www-data root 4096 Mar 31 20:04 photos
drwxr-xr-x  9 www-data root 4096 Mar 31 20:04 privacy
drwxr-xr-x  7 www-data root 4096 Mar 24 20:00 provisioning_api
drwxr-xr-x  6 www-data root 4096 Mar 31 20:04 recommendations
drwxr-xr-x  9 www-data root 4096 Mar 31 20:04 serverinfo
drwxr-xr-x 11 www-data root 4096 Mar 24 20:00 settings
drwxr-xr-x 10 www-data root 4096 Mar 24 20:00 sharebymail
drwxr-xr-x 10 www-data root 4096 Mar 31 20:04 support
drwxr-xr-x  9 www-data root 4096 Mar 31 20:04 survey_client
drwxr-xr-x 10 www-data root 4096 Mar 31 20:04 systemtags
drwxr-xr-x  9 www-data root 4096 Mar 31 20:04 text
drwxr-xr-x  9 www-data root 4096 Mar 24 20:01 theming
drwxr-xr-x  9 www-data root 4096 Mar 24 20:01 twofactor_backupcodes
drwxr-xr-x  9 www-data root 4096 Mar 24 20:01 updatenotification
drwxr-xr-x 12 www-data root 4096 Mar 24 20:01 user_ldap
drwxr-xr-x  9 www-data root 4096 Mar 24 20:01 user_status
drwxr-xr-x  7 www-data root 4096 Mar 31 20:04 viewer
drwxr-xr-x  7 www-data root 4096 Mar 24 20:01 weather_status
drwxr-xr-x  9 www-data root 4096 Mar 24 20:01 workflowengine

bvn13 ★★★★★
() автор топика
Последнее исправление: bvn13 (всего исправлений: 1)
Ответ на: комментарий от bvn13

В неё и ставятся.

Overview of the folders that can be mounted as volumes:

    /var/www/html Main folder, needed for updating
    /var/www/html/custom_apps installed / modified apps
    /var/www/html/config local configuration
    /var/www/html/data the actual data of your Nextcloud
    /var/www/html/themes/<YOUR_CUSTOM_THEME> theming/branding
vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от vvn_black
/var/www/html Main folder, needed for updating

а эта зачем? как используется?

bvn13 ★★★★★
() автор топика

В конце скрипта /entrypoint.sh стоит командушка exec "$@" в которую в качестве параметра реально подставляется apache2-foreground. Попробуйте добавить в конец yml-ки entrypoint-элемент:

entrypoint:
  - bash
  - '-c'
  - |
    /entrypoint.sh true
    ... ваш код ...
    exec apache2-foreground

(ну или через «sh», если «bash» отсутствует в контейнере)

vinvlad ★★
()
Последнее исправление: vinvlad (всего исправлений: 1)
Ответ на: комментарий от vinvlad

путём эксперимента я выяснил, что может быть выполнен после того, как apache2-foreground реально стартанёт.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

путём эксперимента …

тогда придется писать достаточно сложный скрипт, который будет запускать apache2-foreground, потом должен ждать реальной активации apache2-foreground (типа опроса порта), потом запускать ваш кастомный код, а потом переходить в спящее состояние и ожидание сигналов типа SIGTERM. Ситуация еще осложняется тем, что в промежутке между запуском и PHP-инициализацией апач не должен обслуживать входящие запросы.

Но это как-то слишком сложно и неправильно. Очень похоже на то, что вы просто прикладную PHP-часть как-то неправильно продумали-реализовали, поскольку при правильном проектировании не требуется какая-то начальная PHP-иницализация.

vinvlad ★★
()
Ответ на: комментарий от bvn13

… поищите какие-нибудь настроечные фичи PHP-модуля внутри Апача, может есть что.

vinvlad ★★
()
Ответ на: комментарий от vinvlad

я задачу решил уже. нужно было еще один фолдер пробросить на хост.

и скрипт вроде б написал - смотри выше. но его не опробовал толком - решилось гораздо проще.

bvn13 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.