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

elcex8rz  于 2022-11-22  发布在  Docker
关注(0)|答案(2)|浏览(139)

我有一个包含以下代码的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

并且我可以创建映像,但是当我运行带有映像的container时,我在SQL Server上看不到创建的数据库,因为脚本是在SQL Server启动之前执行的。
是否可以在使用SQL Server启动服务后执行脚本?

bkkx9g8r

bkkx9g8r1#

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

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

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

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

4si2a6ki

4si2a6ki2#

你可以点击这个链接https://github.com/microsoft/mssql-docker/issues/11.creits到**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

相关问题