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 EXISTS
types逻辑修改sql语句(如果所有初始化语句都支持这种方式的话)。
我会移动你需要将容器提供到Dockerfile的任何“一次性”脚本。 他们只会在docker-compose build
运行一次。 这样, docker-compose
只需要关心启动和停止服务。