docker-compose:执行数据库脚本

时间:2017-11-03 22:06:35

标签: sql-server docker docker-compose

我正在使用docker-compose和dockerfile设置本地mssql数据库。

我能够在这里使用这个例子:

https://github.com/mcmoe/mssqldocker

执行数据库脚本以在启动时创建数据库。我现在正在运行几个sql脚本来设置数据库。

所以我可以跑:

docker-compose build

...然后

docker-compose up

docker将启动mssql并运行脚本来创建我的数据库,包含表格,视图和预先填充数据的模式。

但是,如果我跑:

docker-compose stop

然后运行:

docker-compose up

它尝试再次运行的所有脚本,这是不好的(很多错误)。 理想情况下,我只希望这一次发生。有没有办法告诉docker如果已经运行脚本而不运行脚本?

我真的想减少本地数据库的设置到一件事:

docker-compose up - 应该做的一切。

编辑:

我尝试使用以下方法包装SQL脚本:

if [ ! -d "/var/lib/mssql/data" ]; then 
  # scripts in here
fi

但它总是跳过它们!

2 个答案:

答案 0 :(得分:0)

我会移动您需要将容器配置到Dockerfile中的任何“一次性”脚本。它们只会在docker-compose build期间运行一次。那样docker-compose只需要关心启动和停止服务。

答案 1 :(得分:0)

要扩展@ Twig2let的point,setup.sql是而不是在Dockerfile中运行。 setup.sql从configure-db.sh运行,它从entrypoint.sh运行,这是Dockerfile中的ENTRYPOINT,这意味着它每次容器启动时都会运行。

如果要在构建阶段安装架构,则必须以某种方式在Dockerfile中使用RUN指令执行它。我怀疑你会发现这很棘手,因为你可能需要在构建过程中启动并运行服务器进程,然后将其关闭。

我怀疑你在添加检查以查看初始化是否已经发生的更好的道路上。您只需要使检测更准确。例如,尝试找一些方法来检查$(MSSQL_DB)是否已经存在,或者修改带有IF NOT EXISTS类型逻辑的sql语句,如果所有初始化语句都支持它。