Запустіть скрипт у Dockerfile


93

Я намагаюся запустити сценарій під час мого процесу побудови у моєму Dockerfile. Але це, здається, не працює.

Я спробував таким чином:

FROM php:7-fpm
ADD bootstrap.sh /
ENTRYPOINT ["/bin/bash", "/bootstrap.sh"]

Також таким чином:

FROM php:7-fpm    
ADD bootstrap.sh /
RUN bash -c "/bootstrap.sh"

А також виконує мій запущений контейнер:

docker exec symfony /bin/bash -c "/bootstrap.sh"

Здається, нічого не працює.

Ви знаєте, як це зробити?


Чи bootstarp.shвстановлений виконуваний біт?
jwodder

Як той RUN chmod + x /bootstarp.sh?
Кевін

2
Що з "не працює", що саме відбувається? Чи відображається помилка? Чи присутній файл всередині зображення? Якщо ви знаходитесь docker exec -it symfony bashвсередині контейнера, чи можете ви вручну запустити сценарій та перевірити його вміст? ( cat bootstarp.sh)?
thaJeztah

спробуйте це: docker exec symfony /bin/bash /bootstarp.shі дайте мені знати результат.
Бойнукс

12
Ермахгерд чоботи!
Бруно Броноскі

Відповіді:


130

RUNі ENTRYPOINTє двома різними способами виконання сценарію.

RUNозначає, що він створює проміжний контейнер, запускає сценарій і заморожує новий стан цього контейнера в новому проміжному зображенні. Після цього сценарій не запускатиметься: ваше остаточне зображення має відображати результат цього сценарію.

ENTRYPOINT означає, що ваше зображення (яке ще не виконало сценарій) створить контейнер і запустить цей сценарій.

В обох випадках слід додати сценарій, і RUN chmod +x /bootstrap.shце гарна ідея.

Це також повинно починатися з шебанга (типу #!/bin/sh)

Беручи до уваги ваш сценарій ( bootstarp.sh: кілька git config --globalкоманд), було б краще, щоб RUNцей сценарій один раз був у вашому Dockerfile, але обов’язково використовував правильного користувача (глобальний git configфайл %HOME%/.gitconfig, який за замовчуванням є /rootодним)

Додайте до свого файлу Docker:

RUN /bootstart.sh

Потім під час запуску контейнера перевірте вміст, /root/.gitconfigщоб підтвердити запуск сценарію.


5
Крім того , ви можете мати в виду , bootstrap.shзамість bootstarp.sh: см stackoverflow.com/a/1254561/6309
VonC

Класно! Дуже добре працює з RUN /bootstrap.sh
Кевін

1
Шебанг на першій лінії зробив це за мене, дякую! :)
GDICommander

34

На додаток до відповідей вище:

Якщо ви створили / відредагували ваш файл сценарію .sh у Windows, переконайтеся, що він був збережений із рядком, що закінчується у форматі Unix . За замовчуванням багато редакторів у Windows перетворюють закінчення рядків Unix у формат Windows, і Linux не розпізнає shebang (#! / Bin / sh) на початку файлу. Отже, Linux видасть повідомлення про помилку, як якщо немає шебанга.

Поради:

  • Якщо ви використовуєте Notepad ++, вам потрібно натиснути "Редагувати / Перетворення EOL / UNIX (LF)"
  • Якщо ви використовуєте Visual Studio, я б запропонував встановити плагін " Кінець рядка ". Потім ви можете зробити закінчення рядків видимими, натиснувши Ctrl-R, Ctrl-W. А щоб встановити закінчення стилю Linux, ви можете натиснути Ctrl-R, Ctrl-L. Для стилю Windows натисніть Ctrl-R, Ctrl-C.

4
Ого, ти врятував мій день. Дякую за це.
mw

2
Блискуче! це була моя ТОЧНА проблема!
Kevinsyel

1
Мій VSCode автоматично встановив у вікнах закінчення сценарію оболонки на CRLF. Збірка докера не вдалася через деякі випадкові символи. Я змінив налаштування в VS Code, і він відразу почав працювати. Дякую! Я проголосував.
Adithya Upadhya

24

Спробуйте створити скрипт за допомогою ADDкоманди та специфікації робочого каталогу. Ось так ("script" - це ім'я сценарію /root/script.sh, де ви хочете, щоб він знаходився в контейнері, це може бути інший шлях:

ADD script.sh /root/script.sh

У цьому випадку це ADDмає бути раніше CMD, якщо у вас є одна BTW, це крутий спосіб імпортувати скрипти в будь-яке місце в контейнері з хост-машини

На CMDмісці[./script]

Він повинен автоматично виконати ваш сценарій

Ви також можете вказати WORKDIRяк /root, тоді вас автоматично помістять у root, при запуску контейнера


Як спочатку Docker визначає, де знаходиться script.sh? Я маю на увазі перший параметр,script.sh
захід сонця

Оскільки ви будуєте контейнер, ви також відповідаєте за розміщення доріжок
Михайло,

шлях та назва першого параметра script.shвідносноDockerfile
eja

4

Кращу практику використовувати COPYзамість того, ADDщоб копіювати з локальної файлової системи на зображення. Крім того, я рекомендую створити підпапку для розміщення вмісту. Якщо нічого іншого, це тримає речі в порядку. Обов’язково позначте сценарій як виконуваний за допомогою chmod.

Тут я створюю scriptsвкладену папку для розміщення мого сценарію та запуску з нього:

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.