起初,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给出了错误
答案 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来检查数据库是否正在运行。)