如何将种子数据放入SQL Server docker镜像?

时间:2017-10-24 14:22:19

标签: asp.net sql-server docker docker-compose

我有一个使用ASP.NET Core和SQL Server的项目。我试图将所有东西都放在docker容器中。对于我的应用程序,我需要在数据库中有一些初始数据。 我可以使用来自microsoft(microsoft / mssql-server-linux)的docker sql server映像,但它(显然)是空的。这是我的docker-compose.yml:

version: "3"
services:
    web:
        build: .\MyProject
        ports:
            - "80:80"
        depends_on:
            - db
    db:
        image: "microsoft/mssql-server-linux"
        environment:
            SA_PASSWORD: "your_password1!"
            ACCEPT_EULA: "Y"

我有一个SQL脚本文件,我需要在数据库上运行以插入初始数据。我找到了一个example的mongodb,但我找不到哪个工具可以代替mongoimport。

4 个答案:

答案 0 :(得分:1)

您可以通过构建自定义图像来实现。我目前正在使用以下解决方案。 dockerfile中的某个位置应该是:

RUN mkdir -p /opt/scripts
COPY database.sql /opt/scripts

ENV MSSQL_SA_PASSWORD=Passw@rd
ENV ACCEPT_EULA=Y

RUN /opt/mssql/bin/sqlservr --accept-eula & sleep 30  & /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Passw@rd' -d master -i /opt/scripts/database.sql 

或者,您可以等待输出特定文本,这在处理dockerfile设置时非常有用,因为它是立即生成的。它不那么健壮,因为它当然依赖于某些“随机”文本:

RUN ( /opt/mssql/bin/sqlservr --accept-eula & ) | grep -q "Service Broker manager has started" \
    && /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Passw@rd' -i /opt/scripts/database.sql

不要忘记将dockerfile旁边的database.sql(带有您的脚本)放置在dockerfile旁边,因为它已复制到映像中。

答案 1 :(得分:0)

一个简单的选择是只导航到容器文件系统并复制数据库文件,然后使用脚本进行附加。

答案 2 :(得分:0)

这个

https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker

有一个在docker容器中使用sqlcmd的例子,虽然我不确定如何将它添加到你拥有的任何构建过程中

答案 3 :(得分:0)

Roet的答案https://stackoverflow.com/a/52280924/10446284对我不起作用。 麻烦在于猛击“&”号过早发射sqlcmd。不等待sleep 30完成。

我们的Dockerfile现在看起来像这样:

FROM microsoft/mssql-server-linux:2017-GA

RUN mkdir -p /opt/scripts
COPY db-seed/seed.sql /opt/scripts/

ENV MSSQL_SA_PASSWORD=Passw@rd
ENV ACCEPT_EULA=true

RUN /opt/mssql/bin/sqlservr & sleep 60; /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Passw@rd' -d master -i /opt/scripts/seed.sql

脚注:

  • 现在bash命令的工作原理如下

      run-asych(sqlservr) & run-asynch(wait-and-run-sqlcmd)`
    
  • 我们选择sleep 60是因为docker映像的构建是在所有runtine环境建立之前“离线”进行的。这60秒不再在容器运行时发生。给sqlservr命令花更多的时间可以使我们队友的机器有更多的时间来成功完成docker build阶段。