运行 SQL SQL 服务器在 docker 上启动后的脚本
Run SQL script after start of SQL Server on docker
我有一个包含以下代码的 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 服务器上看不到创建的数据库,因为脚本是在 SQL 服务器之前执行的开始了。
我可以在使用 SQL 服务器启动服务后执行脚本吗?
运行 用于在图像中构建图层。 CMD 是 运行 当您基于图像启动实例(“容器”)时的命令。
此外,如果您的脚本依赖于这些环境变量,如果它是 Docker 的旧版本,它可能会失败,因为这些变量没有按照您希望的方式定义!
在旧版本的 docker 中,Dockerfile ENV 命令使用空格而不是 "="
您的 Docker 文件可能应该是:
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 构建和 docker 运行 步骤之间的密码,通过使用 docker 运行 --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行的修改版本。
你可以关注这个linkhttps://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
我有一个包含以下代码的 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 服务器上看不到创建的数据库,因为脚本是在 SQL 服务器之前执行的开始了。
我可以在使用 SQL 服务器启动服务后执行脚本吗?
运行 用于在图像中构建图层。 CMD 是 运行 当您基于图像启动实例(“容器”)时的命令。
此外,如果您的脚本依赖于这些环境变量,如果它是 Docker 的旧版本,它可能会失败,因为这些变量没有按照您希望的方式定义!
在旧版本的 docker 中,Dockerfile ENV 命令使用空格而不是 "="
您的 Docker 文件可能应该是:
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 构建和 docker 运行 步骤之间的密码,通过使用 docker 运行 --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行的修改版本。
你可以关注这个linkhttps://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