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