启动Docker容器时如何还原SQL Server数据库?

时间:2019-05-22 17:01:41

标签: sql-server docker

我正在通过现有的model创建一个自定义Docker映像,方法是使用Flyway添加一些数据库,然后在容器内创建数据库的备份。

这个想法是启动Docker容器,并使其从某个目录中找到的备份文件导入所有数据库。

如果我的Docker入口点刚刚启动mcr.microsoft.com/mssql/server:2017-latest-ubuntu,然后我sqlservr从外部还原DB的shell脚本,则一切正常(除了有时SQL Server似乎启动了,但实际上并没有启动) )。

根据https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-configure-docker?view=sql-server-2017#customcontainer,我应该在exec启动之前启动我的shell脚本,因为这是定义容器是否已启动的前台进程。

但这是一个令人毛骨悚然的情况:在运行SQL Server之前,如何在我的shell脚本中执行SQL命令?

我知道通常一个卷可以做到这一点,但这只是一个测试数据库,我不在乎测试完成后数据将如何处理。

这是我的Docker入口点脚本(sqlservr中有一些自定义脚本):

/opt/mssql-tools/bin/

感谢任何提示和建议,“ Docker方式”应该是什么。

2 个答案:

答案 0 :(得分:0)

我敢打赌sp_procoption可以在您的情况下发挥作用。这样,您可以指定一个存储过程,以便在实例每次启动时以及在装入所有数据库且关系引擎开始侦听命令之后运行。

答案 1 :(得分:0)

这是我所做的事情,这并不理想,因为它涉及到“ sleep” 函数,以等待SQL服务器启动并运行,然后再执行SQL ...但它可以工作。 / p>

我具有以下文件夹结构:

  • Dockerfile
  • init /
    • database.sql
    • entrypoint.sh
    • setup.sh

我的Dockerfile如下调用我的entrypoint.sh

FROM microsoft/mssql-server-linux:latest

# Project files
ARG PROJECT_DIR=/srv/db-sql-server
RUN mkdir -p $PROJECT_DIR
WORKDIR $PROJECT_DIR
COPY ./init/ ./

# Grant permissions for scripts to be executable
RUN chmod +x $PROJECT_DIR/entrypoint.sh
RUN chmod +x $PROJECT_DIR/setup.sh

CMD ["/bin/bash", "entrypoint.sh"]

我的entrypoint.sh启动SQL Server,调用另一个自定义外壳程序脚本setup.sh来设置数据库,然后使容器保持活动状态:

#start SQL Server, start the script to create the DB and import the data, start the app
/opt/mssql/bin/sqlservr & ./setup.sh & sleep infinity & wait

我的自定义外壳程序脚本setup.sh等待30秒钟,以便SQL Server启动并运行,然后执行我的SQL文件database.sql以创建数据库/还原数据:

# Wait for SQL Server to be started
sleep 30s

# Run the setup script to create the database
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P $SA_PASSWORD -d master -i database.sql