Docker + mssql-server-linux:如何在构build期间启动.sql文件(来自Dockerfile)

我正在尝试使用MSSQL DB创build自己的Docker镜像进行开发。 它基于microsoft/mssql-server-linux映像。 在构build过程中,我想将一些.sql文件复制到容器中,然后运行这些脚本(创build数据库模式,表格,插入一些数据等)。 我的Dockerfile看起来像这样:

 # use MSSQL 2017 image on Ubuntu 16.04 FROM microsoft/mssql-server-linux:2017-latest # create directory within SQL container for database files RUN mkdir -p /opt/mssql-scripts # copy the database files from host to container COPY sql/000_create_db.sql /opt/mssql-scripts # set environment variables ENV MSSQL_SA_PASSWORD=P@ssw0rd ENV ACCEPT_EULA=Y # run initial scripts RUN /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'P@ssw0rd' -i /opt/mssql-scripts/000_create_db.sql 

000_create_db.sql内容在我看来并不重要。

真正的问题是当我试图用命令Dockerfile docker build -t demo .构build这个Dockerfiledocker build -t demo . 我总是得到这些错误:

 Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Login timeout expired. Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : TCP Provider: Error code 0x2749. Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.. 

但是,当我删除最后一个命令(运行初始脚本),生成并运行图像,并像这样调用相同的命令:

 docker build -t demo . docker run -p 1433:1433 --name mssql -d demo docker exec -it mssql "bash" /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'P@ssw0rd' -i /opt/mssql-scripts/000_create_db.sql 

然后一切进展顺利。 为什么我不能从Dockefile运行脚本?

当你build立图像主进程不运行吃。 在你的情况下,主要过程是SQL Server

只有当你使用命令docker run ... 启动容器时,进程才会docker run ...

你可以在这个阶段进行数据库初始化。 microsoft/mssql-server-linux Dockerfile包含一些提示

将所有SQL Server运行时文件从build drop复制到映像中。 COPY ./install /

只需将构build阶段的init脚本复制到./install目录中即可将其执行到启动阶段。

从mysql-server-linux dockerfile看起来像是在docker run上启动mysql,所以你必须修改你的dockerfile中的最后一个“RUN”命令来在后台启动sql-server,运行你的sql文件并停止sql-服务器。

 RUN /opt/mssql/bin/sqlservr --accept-eula & sleep 10 \ && /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'P@ssw0rd' -i /opt/mssql-scripts/000_create_db.sql \ && pkill sqlservr