docker-compose 在 sql-server-linux 中恢复数据库

Ste*_*Lam 5 sql-server docker sql-server-linux

我正在关注https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-configure-docker?view=sql-server-2017在 macos 中配置和运行独立的 sqlserver 容器数据成功。现在我想创建一个 docker-compose 文件,其中包含两件事:

  1. 网络
  2. 数据库(将 bak 文件从主机复制到容器中并恢复)

我如何实现(2)?

我的 docker-compose 文件:

version: "3"
services:
    web:
        build: 
            context: ./webapi
            dockerfile: Dockerfile
        ports:
            - "4010:80"
        environment: 
            - ASPNETCORE_ENVIRONMENT=Development
        depends_on:
            - db
    db:
        image: "mcr.microsoft.com/mssql/server:2017-latest"
        ports:
            - "4009:1433"
        volumes:
            - "sqlvolume:/var/opt/mssql"
        environment:
            SA_PASSWORD: "<password>"
            ACCEPT_EULA: "Y"
    redis:
        image: "redis:alpine"
volumes:
    sqlvolume:
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 8

有多种不同的方法可以完成恢复任务。如果您的备份位于已安装的卷上,您可以使用 sqlcmd 进行恢复,如下所示:

run docker exec -it db /opt/mssql-tools/bin/sqlcmd -Usa -P<password> -Q"RESTORE DATABASE YourDatabase FROM DISK='/var/opt/mssql/backup/your-backup.bak';"
Run Code Online (Sandbox Code Playgroud)

您可以类似地将备份复制到容器中docker cp并从那里恢复。

如果您的目标是每次容器启动时从已安装的卷恢复数据库,您可以使用该命令构建自定义 SQL Server 映像RESTORE(可以封装在 shell 脚本中)。下面是一个dockerfile例子:

FROM mcr.microsoft.com/mssql/server:2017-latest

CMD /opt/mssql-tools/bin/sqlcmd -U 'sa' -P $MSSQL_SA_PASSWORD -Q"RESTORE DATABASE YourDatabase FROM DISK='/var/opt/mssql/backup/your-backup.bak';" & /opt/mssql/bin/sqlservr
Run Code Online (Sandbox Code Playgroud)

  • @SteveLam,问题链接中的示例显示了此方法。关键是“sqlserver”命令需要是最后一个以保持容器运行,而前面的命令则在后台运行。 (2认同)