Docker контейнер умирает после выполнения команды bash и sql - PullRequest
1 голос
/ 10 октября 2019

Сначала контейнер Docker загружается нормально, но вскоре после задержки и выполнения файла schema.sql он отключается и умирает.

Возможно, что-то не так с entry-point.sh или следующей командной строкой.

command: bash -c "/opt/mssql/bin/sqlservr & chmod +x entry-point.sh && ./entry-point.sh"

docker-compose.sql

database:
  image: microsoft/mssql-server-linux:2017-latest
  container_name: database
  ports:
    - 1433:1433
  volumes:
    - /var/opt/mssql
    - ./assets:/assets
  working_dir: /assets
  command: bash -c "/opt/mssql/bin/sqlservr & chmod +x entry-point.sh && ./entry-point.sh"
  environment:
    SA_PASSWORD: "Password"
    ACCEPT_EULA: "Y"

entry-point.sh

#!/usr/bin/env bash

#wait for the SQL Server to come up
sleep 10s

#run the setup script to create the DB and the schema in the DB
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Password -d master -i schema.sql

schema.sql

CREATE DATABASE DataDemo;
GO

USE DataDemo;
GO

Редактировать пробовал разные подходы, но не удалось настроить базу данных в докере со сценарием инициализации.

Edit2

после ответа загрузчик выдал ошибку

enter image description here

1 Ответ

1 голос
/ 10 октября 2019

Как только это command: заканчивается, контейнер выходит. В вашем случае вы запускаете фоновый процесс, а затем запускаете две команды. Как только эти две команды завершены, контейнер готов;не имеет значения, что фоновый процесс - это то, что вы на самом деле хотели, чтобы контейнер делал.

Большинство стандартных изображений базы данных предоставляют некоторые средства для предварительного заполнения данных приложения;если я нашел правильный файл Dockerfile, образы Microsoft SQL Server не имеют этой возможности. (Сценарий PostgreSQL для этого довольно сложен, и я, вероятно, не буду пытаться копировать его самостоятельно.)

Один простой способ сделать это - выполнить инициализацию вдругой контейнер.

version: '3'
services:
  database:
    image: microsoft/mssql-server-linux:2017-latest
    ports:
      - 1433:1433
    volumes:
      - /var/opt/mssql
    environment:
      SA_PASSWORD: "Password"
      ACCEPT_EULA: "Y"
  loader:
    image: microsoft/mssql-tools:2017-latest
    volumes:
      - ./assets:/assets
    command: /assets/entry-point.sh
    restart: no
    environment:
      SA_HOST: database
      SA_PASSWORD: Password

(Вы можете создать собственный образ, включающий скрипт загрузчика, а не монтировать его в контейнер, и использовать что-то более надежное, например, скрипт для ожидания чтобы убедиться, что база данных запущена.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...