docker容器在bash命令和sql执行后死亡

时间:2019-10-10 03:55:54

标签: sql-server bash docker docker-compose

起初,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

编辑尝试了不同的方法,但是无法使用初始化脚本在docker中设置数据库。

Edit2

以下回答,Loader给出了错误

enter image description here

1 个答案:

答案 0 :(得分:1)

command:完成后,容器退出。在您的情况下,您要启动一个后台进程,然后运行两个命令。一旦这两个命令完成,便完成了容器。后台进程是您实际上希望容器执行的操作都没关系。

大多数标准数据库映像提供了一些预先填充应用程序数据的方法;如果我找到正确的Dockerfile,则Microsoft's SQL server images不具备此功能。 (PostgreSQL entrypoint script要做的很复杂,我可能不会尝试自己复制它。)

一个简单的方法是在另一个容器中进行初始化。

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

(您可以构建一个包含加载程序脚本的自定义映像,而不是将其安装到容器中,并使用更强大的功能,例如wait-for-it script来检查数据库是否正在运行。)