У меня есть файл docker-compose.yml, и я запускаю контейнер с БД через
docker-compose up -d db
команда.
Мне нужно выполнить скрипт на хост-компьютере, который, короче говоря, экспортирует дамп в БД в контейнере.
Итак, теперь это выглядит так:
docker-compose up -d db
./script.sh
Но я хочу объединить эти две команды в одну. Мой вопрос "Является ли это возможным?"
Я узнал, что Docker Compose не поддерживает эту функцию.
Я знаю, что могу создать еще один скрипт с этими командами, но хочу оставить только
docker-compose up -d db
UPD: Хочу отметить, что я использую mcr.microsoft.com/mssql/server:2017-latest
картинку
Кроме того, должен еще раз сказать, что Мне нужно выполнить скрипт точно на хост-машине
@ Turing85 Да, я упомяну, что использую mcr.microsoft.com/mssql/server:2017-latest image
@ Turing85 Спасибо, только что сделал это!
Мой последний комментарий скоро самоуничтожится.
нуууу sh -c "docker-compose up -d db ; script.sh"
?
Вы не можете использовать инструменты Docker для выполнения команд в хост-системе. Общий принцип дизайна Docker заключается в том, что контейнеры не должны влиять на хост.
Ничто не мешает вам написать собственный сценарий оболочки, который запускается на хосте и выполняет необходимые вам действия:
#!/bin/sh
docker-compose -d up
./wait-for.sh localhost 1433
./script.sh
(Сценарий wait-for.sh
такой же, как описано в ответах на Docker Compose дождаться контейнера X перед запуском Y, которые не зависят от проверок работоспособности Docker.)
В вашем случае можно запустить импортер данных в отдельном контейнере. Типичная установка может выглядеть следующим образом; обратите внимание, что импортер будет запускаться каждый раз, когда вы запускаете docker-compose up
. Возможно, вы захотите встроить это в отдельный образ.
version: '3.8'
services:
db: { same: as you have currently }
importer:
image: mcr.microsoft.com/mssql/server:2017-latest
entrypoint: ./wait-for.sh db 1433 -- ./script.sh
workdir: /import
volumes: [.:/import]
Контейнеры базы данных с открытым исходным кодом также обычно поддерживают размещение сценариев в /docker-entrypoint-initdb.d
, которые выполняются при первом запуске контейнера, но образ SQL Server, похоже, не поддерживает это; такие вопросы, как Как восстановить базу данных SQL Server при запуске контейнера Docker?, имеют сложную настройку для воспроизведения этого поведения.
Большое спасибо! Наверное, мне подходит способ использования другого контейнера!
Это сильно зависит от точного используемого изображения. Например, Официальный образ докера postgres выполняет все сценарии
*.sql
,*.sql.gz
и*.sh
в каталоге/docker-entrypoint-initdb.d
.