Как запустить скрипт в докере без выхода ⇐ Linux
-
Гость
Как запустить скрипт в докере без выхода
Во-первых, да, я видел похожие вопросы, но не нашел ни одного, который бы отвечал моим потребностям.
Раньше у меня был Dockerimage, который успешно создал контейнер:
ИЗ php:8.1.12-fpm ARG uid=1000 Пользователь ARG = inigomontoya ЗАПУСК apt-get update && apt-get install -y \ libpng-dev \ libonig-dev \ libxml2-dev \ libzip-dev \ мерзавец \ локон \ zip \ разархивировать \ руководитель # Установите и включите xDebug ЗАПУСТИТЕ pecl install xdebug \ && docker-php-ext-enable xdebug ВЫПОЛНИТЬ apt-get clean && rm -rf /var/lib/apt/lists/* # Установите модули php, необходимые для laravel. ЗАПУСК docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip # Создайте системного пользователя для запуска команд Composer и Artisan. RUN useradd -G www-data,root -u $uid -d /home/$user $user ВЫПОЛНИТЬ mkdir -p /home/$user/.composer && \ chown -R $user:$user /home/$user # Установить композитор КОПИРОВАТЬ --from=composer:latest /usr/bin/composer /usr/bin/composer # Создать каталог для журналов супервизора ВЫПОЛНИТЬ mkdir -p "/etc/supervisor/logs" && chmod -R 775 "/etc/supervisor/logs" # Установить рабочий каталог РАБОЧИЙ ПАРАМЕТР /var/www # Копируем файлы конфигурации супервизора КОПИРОВАТЬ ./docker/config/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf ПОЛЬЗОВАТЕЛЬ $user затем мне понадобилось добавить несколько дополнительных пакетов: cups и cups-pdf. Поэтому я добавил необходимые пакеты и создал сценарий startup.sh, который будет отвечать за запуск cups, тогда мой Dockerfile выглядел следующим образом. :
ИЗ php:8.1.12-fpm ARG uid=1000 Пользователь ARG = inigomontoya ЗАПУСК apt-get update && apt-get install -y \ libpng-dev \ libonig-dev \ libxml2-dev \ libzip-dev \ мерзавец \ локон \ zip \ разархивировать \ руководитель \ чашки\ чашки-pdf # Установите и включите xDebug ЗАПУСТИТЕ pecl install xdebug \ && docker-php-ext-enable xdebug ВЫПОЛНИТЬ apt-get clean && rm -rf /var/lib/apt/lists/* # Установите модули php, необходимые для laravel. ЗАПУСК docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip # Создайте системного пользователя для запуска команд Composer и Artisan. RUN useradd -G www-data,root -u $uid -d /home/$user $user ВЫПОЛНИТЬ mkdir -p /home/$user/.composer && \ chown -R $user:$user /home/$user # Установить композитор КОПИРОВАТЬ --from=composer:latest /usr/bin/composer /usr/bin/composer # Создать каталог для журналов супервизора ВЫПОЛНИТЬ mkdir -p "/etc/supervisor/logs" && chmod -R 775 "/etc/supervisor/logs" # Установить рабочий каталог РАБОЧИЙ ПАРАМЕТР /var/www # Копируем файлы конфигурации супервизора КОПИРОВАТЬ ./docker/config/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf КОПИРУЙТЕ cupsd.conf /etc/cups/cupsd.conf. КОПИРОВАТЬ start.sh ВЫПОЛНИТЬ ["chmod", "+x", "startup.sh"] ПОЛЬЗОВАТЕЛЬ $user ТОЧКА ВХОДА ["./startup.sh"] где ./startup.sh имеет следующий вид:
#!/bin/bash # включаем контроль заданий bash. установить -м # запустить КУПС /usr/sbin/cupsd -f Я думал, что это все, что мне нужно. Контейнер создавался без ошибок, и когда я получил к нему доступ, я увидел, что lpstat (процесс, инициированный cups) запущен. Но, о, сюрприз, который я испытал, когда увидел, что не могу получить доступ к своему API, я получил сообщение Ошибка: не удалось подключиться к серверу.
После некоторого чтения я узнал, что переопределяю команду images ENTRYPOINT, которая в данном случае фактически запускала PHP.
Я зашел на официальную страницу изображений на GitHub и заметил, что они использовали команду:
CMD ["php-fpm"]
Поэтому я подумал о том, чтобы вручную запустить команду изображения, чтобы можно было запускать вместе с ней любые другие команды. Поэтому я изменил свой Dockerfile, чтобы он содержал следующее (просто перечислил несколько последних строк, которые я обновил):
КОПИРОВАТЬ start.sh start.sh ВЫПОЛНИТЬ ["chmod", "+x", "startup.sh"] ПОЛЬЗОВАТЕЛЬ $user CMD ["php-fpm"] ВЫПОЛНИТЬ ["bash", "startup.sh"] также пробовал разные варианты одного и того же, например, сначала запускал мой bash-скрипт, а затем php-fpm или запускал ./startup.sh вместо того, как я делал это, но все они дают один и тот же результат:
ОШИБКА [app stage-0 15/15] RUN ["bash", "startup.sh"] 0,1 с ------ > [app stage-0 15/15] ВЫПОЛНИТЬ ["bash", "startup.sh"]: 0.103 Прекращено ------ не удалось решить: процесс «bashstartup.sh» не завершился успешно: код выхода: 143 make: *** [start-dev] Ошибка 17 Я также попробовал запустить команду как отдельную команду вместо скрипта, вот:
CMD ["/usr/sbin/cupsd -f"]
Этот последний шаг позволяет собрать контейнер, но при доступе к контейнеру, похоже, он не запускает чашки.
Я читал, что так и должно быть: как только сценарий будет завершен, это означает, что больше нечего делать, что я должен добавить команду sleep или что-то еще заставляет скрипт работать вечно, поэтому я так и сделал:
#!/bin/bash # включаем контроль заданий bash. установить -м # запустить КУПС /usr/sbin/cupsd -f спать бесконечность и теперь мой контейнер даже не собирается. Он зависает во время выполнения скрипта (что имеет смысл):
... => КЭШИРОВАНО [app stage-0 14/15] RUN ["chmod", "+x", "startup.sh"] 0,0 с => [app stage-0 15/15] RUN ["bash", "startup.sh"] Я создаю контейнеры следующим образом (я использую docker-compose):
docker-compose -f docker-compose.dev.yaml up --build
Есть предложения? как я могу просто запустить команду при запуске контейнера и продолжать обслуживать свои данные как обычно?
Спасибо.
Во-первых, да, я видел похожие вопросы, но не нашел ни одного, который бы отвечал моим потребностям.
Раньше у меня был Dockerimage, который успешно создал контейнер:
ИЗ php:8.1.12-fpm ARG uid=1000 Пользователь ARG = inigomontoya ЗАПУСК apt-get update && apt-get install -y \ libpng-dev \ libonig-dev \ libxml2-dev \ libzip-dev \ мерзавец \ локон \ zip \ разархивировать \ руководитель # Установите и включите xDebug ЗАПУСТИТЕ pecl install xdebug \ && docker-php-ext-enable xdebug ВЫПОЛНИТЬ apt-get clean && rm -rf /var/lib/apt/lists/* # Установите модули php, необходимые для laravel. ЗАПУСК docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip # Создайте системного пользователя для запуска команд Composer и Artisan. RUN useradd -G www-data,root -u $uid -d /home/$user $user ВЫПОЛНИТЬ mkdir -p /home/$user/.composer && \ chown -R $user:$user /home/$user # Установить композитор КОПИРОВАТЬ --from=composer:latest /usr/bin/composer /usr/bin/composer # Создать каталог для журналов супервизора ВЫПОЛНИТЬ mkdir -p "/etc/supervisor/logs" && chmod -R 775 "/etc/supervisor/logs" # Установить рабочий каталог РАБОЧИЙ ПАРАМЕТР /var/www # Копируем файлы конфигурации супервизора КОПИРОВАТЬ ./docker/config/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf ПОЛЬЗОВАТЕЛЬ $user затем мне понадобилось добавить несколько дополнительных пакетов: cups и cups-pdf. Поэтому я добавил необходимые пакеты и создал сценарий startup.sh, который будет отвечать за запуск cups, тогда мой Dockerfile выглядел следующим образом. :
ИЗ php:8.1.12-fpm ARG uid=1000 Пользователь ARG = inigomontoya ЗАПУСК apt-get update && apt-get install -y \ libpng-dev \ libonig-dev \ libxml2-dev \ libzip-dev \ мерзавец \ локон \ zip \ разархивировать \ руководитель \ чашки\ чашки-pdf # Установите и включите xDebug ЗАПУСТИТЕ pecl install xdebug \ && docker-php-ext-enable xdebug ВЫПОЛНИТЬ apt-get clean && rm -rf /var/lib/apt/lists/* # Установите модули php, необходимые для laravel. ЗАПУСК docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip # Создайте системного пользователя для запуска команд Composer и Artisan. RUN useradd -G www-data,root -u $uid -d /home/$user $user ВЫПОЛНИТЬ mkdir -p /home/$user/.composer && \ chown -R $user:$user /home/$user # Установить композитор КОПИРОВАТЬ --from=composer:latest /usr/bin/composer /usr/bin/composer # Создать каталог для журналов супервизора ВЫПОЛНИТЬ mkdir -p "/etc/supervisor/logs" && chmod -R 775 "/etc/supervisor/logs" # Установить рабочий каталог РАБОЧИЙ ПАРАМЕТР /var/www # Копируем файлы конфигурации супервизора КОПИРОВАТЬ ./docker/config/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf КОПИРУЙТЕ cupsd.conf /etc/cups/cupsd.conf. КОПИРОВАТЬ start.sh ВЫПОЛНИТЬ ["chmod", "+x", "startup.sh"] ПОЛЬЗОВАТЕЛЬ $user ТОЧКА ВХОДА ["./startup.sh"] где ./startup.sh имеет следующий вид:
#!/bin/bash # включаем контроль заданий bash. установить -м # запустить КУПС /usr/sbin/cupsd -f Я думал, что это все, что мне нужно. Контейнер создавался без ошибок, и когда я получил к нему доступ, я увидел, что lpstat (процесс, инициированный cups) запущен. Но, о, сюрприз, который я испытал, когда увидел, что не могу получить доступ к своему API, я получил сообщение Ошибка: не удалось подключиться к серверу.
После некоторого чтения я узнал, что переопределяю команду images ENTRYPOINT, которая в данном случае фактически запускала PHP.
Я зашел на официальную страницу изображений на GitHub и заметил, что они использовали команду:
CMD ["php-fpm"]
Поэтому я подумал о том, чтобы вручную запустить команду изображения, чтобы можно было запускать вместе с ней любые другие команды. Поэтому я изменил свой Dockerfile, чтобы он содержал следующее (просто перечислил несколько последних строк, которые я обновил):
КОПИРОВАТЬ start.sh start.sh ВЫПОЛНИТЬ ["chmod", "+x", "startup.sh"] ПОЛЬЗОВАТЕЛЬ $user CMD ["php-fpm"] ВЫПОЛНИТЬ ["bash", "startup.sh"] также пробовал разные варианты одного и того же, например, сначала запускал мой bash-скрипт, а затем php-fpm или запускал ./startup.sh вместо того, как я делал это, но все они дают один и тот же результат:
ОШИБКА [app stage-0 15/15] RUN ["bash", "startup.sh"] 0,1 с ------ > [app stage-0 15/15] ВЫПОЛНИТЬ ["bash", "startup.sh"]: 0.103 Прекращено ------ не удалось решить: процесс «bashstartup.sh» не завершился успешно: код выхода: 143 make: *** [start-dev] Ошибка 17 Я также попробовал запустить команду как отдельную команду вместо скрипта, вот:
CMD ["/usr/sbin/cupsd -f"]
Этот последний шаг позволяет собрать контейнер, но при доступе к контейнеру, похоже, он не запускает чашки.
Я читал, что так и должно быть: как только сценарий будет завершен, это означает, что больше нечего делать, что я должен добавить команду sleep или что-то еще заставляет скрипт работать вечно, поэтому я так и сделал:
#!/bin/bash # включаем контроль заданий bash. установить -м # запустить КУПС /usr/sbin/cupsd -f спать бесконечность и теперь мой контейнер даже не собирается. Он зависает во время выполнения скрипта (что имеет смысл):
... => КЭШИРОВАНО [app stage-0 14/15] RUN ["chmod", "+x", "startup.sh"] 0,0 с => [app stage-0 15/15] RUN ["bash", "startup.sh"] Я создаю контейнеры следующим образом (я использую docker-compose):
docker-compose -f docker-compose.dev.yaml up --build
Есть предложения? как я могу просто запустить команду при запуске контейнера и продолжать обслуживать свои данные как обычно?
Спасибо.
Мобильная версия