Как выполнить скрипт на хосте после запуска контейнера докеров

У меня есть файл 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 картинку

Кроме того, должен еще раз сказать, что Мне нужно выполнить скрипт точно на хост-машине

Это сильно зависит от точного используемого изображения. Например, Официальный образ докера postgres выполняет все сценарии *.sql, *.sql.gz и *.sh в каталоге /docker-entrypoint-initdb.d.

Turing85 20.03.2022 13:43

@ Turing85 Да, я упомяну, что использую mcr.microsoft.com/mssql/server:2017-latest image

Артём Петров 20.03.2022 13:47

@ Turing85 Спасибо, только что сделал это!

Артём Петров 20.03.2022 13:50

Мой последний комментарий скоро самоуничтожится.

Turing85 20.03.2022 13:51

нуууу sh -c "docker-compose up -d db ; script.sh"?

KamilCuk 20.03.2022 14:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете использовать инструменты 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?, имеют сложную настройку для воспроизведения этого поведения.

Большое спасибо! Наверное, мне подходит способ использования другого контейнера!

Артём Петров 21.03.2022 12:58

Другие вопросы по теме