我正在使用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
但它总是跳过它们!
答案 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语句,如果所有初始化语句都支持它。