docker-compose:执行数据库脚本

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

我可以在这里使用这个例子:

https://github.com/mcmoe/mssqldocker 

它在启动时执行数据库脚本来创build数据库。 我现在正在运行几个SQL脚本来设置数据库。

所以我可以运行:

 docker-compose build 

然后…

 docker-compose up 

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

但是,如果我运行:

 docker-compose stop 

然后运行:

 docker-compose up 

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

我真的想减less本地数据库的设置真的是一回事:

docker-compose up – 应该尽一切努力。

编辑:

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

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

但它总是跳过它们!

为了扩展@ Twig2let,setup.sql 不在 Dockerfile中运行。 setup.sql是从configure-db.sh运行的,它是从入口点.sh(它是Dockerfile中的ENTRYPOINT)运行的,这意味着它在每次容器启动时运行。

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

我怀疑你是在一个更好的path添加你的支票,看看是否已经发生了初始化。 你只需要使检测更准确。 例如,尝试find一些方法来检查$(MSSQL_DB)已经存在,或者用IF NOT EXISTStypes逻辑修改sql语句(如果所有初始化语句都支持这种方式的话)。

我会移动你需要将容器提供到Dockerfile的任何“一次性”脚本。 他们只会在docker-compose build运行一次。 这样, docker-compose只需要关心启动和停止服务。