在 Dockerfile 中恢复 SQL Server DB.bak

Jos*_*ott 4 docker dockerfile docker-compose

我正在运行一个 .NET Razor 应用程序、一个 gitea 实例和一个 SQL Server 数据库,每个容器都在相互通信的单独容器中。我想使用数据库架构和数据(通过恢复文件.bak)启动我的数据库映像。

我可以使用当前的 Dockerfile 来执行此操作,如果它启动并运行后,我可以运行以下附加命令:

  1. docker exec -it myContainer /opt/mssql-tools/bin/sqlsmd -S localhost -U sa -P myPassword

  2. /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P myPassword -Q "RESTORE DATABASE MY_DB_NAME FROM DISK='/var/opt/mssql/backup/MY_DB_NAME.bak' WITH MOVE 'MY_DB_NAME_TEST' TO '/var/opt/mssql/data/MY_DB_NAME_TEST.mdf', MOVE 'MY_DB_NAME_TEST_log' TO '/var/opt/mssql/data/MY_DB_NAME_TEST_log.ldf'"

这样就完成了工作,但我想完全自动化该过程,以便由我的 docker-compose.yml 和 Dockerfile 100% 配置,所以我只需要输入:docker-compose up -d

我认为 docker-compose.yml 文件的内容不相关,但这是我的 Dockerfile(我正在尝试运行当前需要运行的脚本docker-compose up):

FROM microsoft/mssql-server-linux

ENV SA_PASSWORD=myPassword
ENV ACCEPT_EULA=Y

COPY ./ACES_DB.bak /var/opt/mssql/backup/MY_DB_NAME.bak
RUN docker exec -it myContainer bin/sh /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P myPassword -Q "RESTORE DATABASE MY_DB_NAME FROM DISK='/var/opt/mssql/backup/MY_DB_NAME.bak' WITH MOVE 'MY_DB_NAME_TEST' TO '/var/opt/mssql/data/MY_DB_NAME_TEST.mdf', MOVE 'MY_DB_NAME_TEST_log' TO '/var/opt/mssql/data/MY_DB_NAME_TEST_log.ldf'"  
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激。

Jos*_*ott 8

我和一个朋友一起困惑这个问题,最终找到了解决方案。docker 文件如下所示:

FROM microsoft/mssql-server-linux
ENV MSSQL_SA_PASSWORD=myPassword
ENV ACCEPT_EULA=Y

COPY ./My_DB.bak /var/opt/mssql/backup/My_DB.bak
COPY restore.sql restore.sql
RUN (/opt/mssql/bin/sqlservr --accept-eula & ) | grep -q "Starting database restore" && /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'myPassword' -d master -i restore.sql
Run Code Online (Sandbox Code Playgroud)

*请注意,我将 SQL 恢复语句移至 .sql 文件中。