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

Art*_*ase 5 t-sql sql-server-express docker dockerfile

我有一个带有以下代码的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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 8

您可以点击此链接https://github.com/microsoft/mssql-docker/issues/11。感谢罗宾·莫法特。 更改 docker-compose.yml 文件以包含以下内容

mssql:
image: microsoft/mssql-server-windows-express
environment: 
  - SA_PASSWORD=##$wo0RD!
  - ACCEPT_EULA=Y
volumes:
 # directory with sql script on pc to /scripts/
 # - ./data/mssql:/scripts/
  - ./create-db.sql:/scripts/
command:
  - /bin/bash
  - -c 
  - |
    # Launch MSSQL and send to background
    /opt/mssql/bin/sqlservr &
    # Wait 30 seconds for it to be available
    # (lame, I know, but there's no nc available to start prodding network ports)
    sleep 30
    # Run every script in /scripts
    # TODO set a flag so that this is only done once on creation, 
    #      and not every time the container runs
    for foo in /scripts/*.sql
      do /opt/mssql-tools/bin/sqlcmd -U sa -P $$SA_PASSWORD -l 30 -e -i $$foo
    done
    # So that the container doesn't shut down, sleep this thread
    sleep infinity
Run Code Online (Sandbox Code Playgroud)


dag*_*elf 6

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 
Run Code Online (Sandbox Code Playgroud)

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

(如果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
Run Code Online (Sandbox Code Playgroud)

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

  • 我目前正在运行 docker 容器后通过运行入口点脚本来执行此操作(使用 mcr.microsoft.com/mssql/server:2017-latest)。然而,在构建时仅播种一次数据是更好的解决方案。唯一的问题是,数据库似乎无法访问。我总是得到: 步骤 5/5 : RUN /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 13j1k23j1l3H!-d master -i db-init.sql ---> 在 57452421d9d4 中运行 Sqlcmd:错误:Microsoft ODBC Driver 17 for SQL Server:登录超时已过期。 (3认同)
  • 考虑到服务可能没有启动,这是有道理的,对吗?我该如何解决这个问题? (2认同)