【问题标题】:Run SQL script after start of SQL Server on docker在 docker 上启动 SQL Server 后运行 SQL 脚本
【发布时间】:2018-12-05 15:06:57
【问题描述】:

我有一个带有以下代码的 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 启动服务后执行脚本吗?

【问题讨论】:

  • 您可以在启动 Docker 并使用来自主机(您的 PC)的 SSMS 连接到 Docker 容器上的 SQL Server 后运行脚本。或者您需要动态执行此操作?
  • 我想动态地做,因为我想在运行容器后立即拥有带有具体数据库的 SQL Server
  • 对于 Docker 初学者,这里是在 docker thecodeframework.com/run-sql-server-inside-a-docker-container 中运行 SQL Server 的方法

标签: tsql docker dockerfile sql-server-express


【解决方案1】:

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 行的修改版本。

【讨论】:

  • 好的,我更改了它,当我构建映像并运行映像时,我看到容器大约 1 分钟,在接下来的 1 分钟容器停止后
  • 当我将 CMD 更改为 RUN 时,它开始正常工作,并且适用于我的两个版本的 Dockerfile :)。在第一个版本中,我有从头开始创建数据库的脚本,在第二个版本中,我从 bak 文件中恢复了数据库。 CMD 选项我不会使用它,因为我没有任何选项来获取文件 mdf 和 ldf 我只能有脚本或备份文件。非常感谢您的帮助:)
  • 我目前正在通过运行入口点脚本在运行 docker 容器后执行此操作(使用 mcr.microsoft.com/mssql/server:2017-latest)。但是,在构建时只播种一次数据是一个更好的解决方案。唯一的问题,数据库似乎无法访问。我总是得到: 第 5/5 步:运行 /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:登录超时。
  • 有道理,考虑到服务可能没有启动,对吧?我该如何解决这个问题?
  • @rStorms 你设法解决了这个问题吗?我目前也遇到这种情况。
【解决方案2】:

您可以点击此链接https://github.com/microsoft/mssql-docker/issues/11。 归功于 Robin Moffatt。 更改您的 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

【讨论】:

    猜你喜欢
    • 2020-01-02
    • 2021-05-17
    • 1970-01-01
    • 2021-07-16
    • 2016-01-05
    • 1970-01-01
    • 2022-12-22
    • 2019-07-13
    • 2018-05-16
    相关资源
    最近更新 更多