在docker上启动SQL Server后运行SQL脚本

问题描述 投票:3回答:1

我有一个带有以下代码的Dockerfile

FROM microsoft/mssql-server-windows-express
COPY ./create-db.sql .
ENV ACCEPT_EULA=Y
ENV sa_password=##$wo0RD!
CMD sqlcmd -i create-db.sql

我可以创建图像,但是当我使用图像运行容器时,我在SQL Server上看不到创建的数据库,因为脚本是在SQL Server启动之前执行的。

在使用SQL Server启动服务后,我可以执行该脚本吗?

tsql docker dockerfile sql-server-express
1个回答
5
投票

RUN用于构建图像中的图层。 CMD是启动映像实例时运行的命令(“容器”)

此外,如果您的脚本依赖于这些环境变量,如果它是旧版本的Docker,它可能会失败,因为这些变量没有按照您希望的方式定义!

在较旧版本的docker中,Dockerfile ENV命令使用空格而不是“=”

您的Dockerfile应该是:

FROM microsoft/mssql-server-windows-express
COPY ./create-db.sql .
ENV ACCEPT_EULA Y
ENV sa_password ##$wo0RD!
RUN sqlcmd -i create-db.sql 

这将创建包含数据库的图像,其中包含您的密码。

(如果SQL文件以某种方式使用环境变量,这将没有意义,因为您可能在复制之前更新SQL文件。)如果您希望能够覆盖docker build和docker run之间的密码步骤,通过使用docker run --env sa_password=##$wo0RD! ...,您需要将最后一行更改为:

CMD sqlcmd -i create-db.sql && .\start -sa_password $env:sa_password \
-ACCEPT_EULA $env:ACCEPT_EULA -attach_dbs \"$env:attach_dbs\" -Verbose

这是从上游图像继承的CMD行的修改版本。

© www.soinside.com 2019 - 2024. All rights reserved.