С помощью такого трюка можно запустить какие-то миграции для БД или залить туда какой-то дамп с данными или схемой, сгенерировать какой-нибудь конфиг, создать нужные директории или просто что-то записать, если по какой-то причине вам это надо сделать именно там (куда же без костылей). Для того, чтобы не тащить внешние скрипты, выполним всё прямо в command первого контейнера.
Удобно для этого взять busybox, потому что там много всего есть и он маленький. Но можно обойтись и голым alpine.
services:
init-nginx:
image: alpine
command: ["/bin/sh", "-c", "echo 'server { listen 80; root /usr/share/nginx/html; }' > /config/nginx.conf && echo 'Compose Exec' > /html/index.html"]
volumes:
- nginx_config:/config
- nginx_html:/html
nginx:
image: nginx:latest
volumes:
- nginx_config:/etc/nginx/conf.d
- nginx_html:/usr/share/nginx/html
ports:
- "8080:80"
depends_on:
init-nginx:
condition: service_completed_successfully
volumes:
nginx_config:
nginx_html:
Прямо в compose файле создали конфигурацию Nginx и добавили статическую страничку. Вместо длинной строки command можно записать более наглядно:
entrypoint: /bin/sh
command:
- "-c"
- |
echo 'server { listen 80; root /usr/share/nginx/html; }' > /config/nginx.conf
echo 'Compose Exec' > /html/index.html
Если что-то пойдёт не так и команда не будет выполнена успешно, то второй контейнер не запустится из-за
condition: service_completed_successfully.Если надо что-то сделать на самом хосте перед запуском контейнеров, то просто через volumes подключаем директорию хоста и делаем там всё, что нам надо.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#docker #devops
