gpt4 book ai didi

sql-server - 仅使用 Dockerfile 创建具有已恢复备份数据库的 SQL Server docker 镜像

转载 作者:行者123 更新时间:2023-12-05 02:38:37 27 4
gpt4 key购买 nike

以下 docker 文件使用从备份 (rmsdev.bak) 恢复的数据库创建自定义 SQL 服务器镜像。

FROM mcr.microsoft.com/mssql/server:2019-latest
ENV MSSQL_PID=Developer
ENV SA_PASSWORD=Password1?
ENV ACCEPT_EULA=Y

USER mssql

COPY rmsdev.bak /var/opt/mssql/backup/

# Launch SQL Server, confirm startup is complete, restore the database, then terminate SQL Server.
RUN ( /opt/mssql/bin/sqlservr & ) | grep -q "Service Broker manager has started" \
&& /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P $SA_PASSWORD -Q 'RESTORE DATABASE rmsdev FROM DISK = "/var/opt/mssql/backup/rmsdev.bak" WITH MOVE "rmsdev" to "/var/opt/mssql/data/rmsdev.mdf", MOVE "rmsdev_Log" to "/var/opt/mssql/data/rmsdev_log.ldf", NOUNLOAD, STATS = 5' \
&& pkill sqlservr

CMD ["/opt/mssql/bin/sqlservr"]

问题是,一旦恢复完成,就不再需要备份文件了,我想将其从镜像中删除。

不幸的是,由于 docker 镜像的形成方式(层),我不能像我想的那样简单地“rm”文件。

Multistage Dockerfile 在这种情况下并不像在构建场景中那样容易适用。另一种方法是运行容器,恢复备份,然后提交新图像,但我想要做的是仅使用带有正确 Dockerfile 的 docker build。

有没有人知道方法?

最佳答案

如果您知道数据目录在图像中的位置,并且图像没有将该目录声明为 VOLUME,那么您可以为此使用多阶段构建。第一阶段将设置数据目录,如您所示。第二阶段将从第一阶段复制填充的数据目录,但不复制备份文件。这个技巧可能取决于运行相同构建的底层软件的两个阶段。

对于 SQL Server,Docker Hub pageGitHub repo两者都很难找到,而且令人惊讶的是,它们都没有谈到数据存储问题(正如@HansKillian 在评论中指出的那样,您几乎总是希望将数据库数据存储在某种卷中)。 GitHub 存储库确实包含一个 Helm chart围绕 Kubernetes StatefulSet build 从中我们可以发现数据目录将是 mounted/var/opt/mssql 上。

所以我可能会像这样编写一个多阶段构建:

# Put common setup steps in an initial stage
FROM mcr.microsoft.com/mssql/server:2019-latest AS setup
ENV MSSQL_PID=Developer
ENV SA_PASSWORD=Password1? # (weak password, easily extracted with `docker inspect`)
ENV ACCEPT_EULA=Y # (legally probably the end user needs to accept this not the image builder)

# Have a stage specifically to populate the data directory
FROM setup AS data
# (copy-and-pasted from the question)
USER mssql
COPY rmsdev.bak / # not under /var/opt/mssql
RUN ( /opt/mssql/bin/sqlservr & ) | grep -q "Service Broker manager has started" \
&& /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P $SA_PASSWORD -Q 'RESTORE DATABASE rmsdev FROM DISK = "/rmsdev.bak" WITH MOVE "rmsdev" to "/var/opt/mssql/data/rmsdev.mdf", MOVE "rmsdev_Log" to "/var/opt/mssql/data/rmsdev_log.ldf", NOUNLOAD, STATS = 5' \
&& pkill sqlservr

# Final stage that actually will actually be run.
FROM setup
# Copy the prepopulated data tree, but not the backup file
COPY --from=data /var/opt/mssql /var/opt/mssql
# Use the default USER, CMD, etc. from the base SQL Server image

mysqlpostgres 等标准的 Docker Hub 开源数据库镜像通常在它们的 Dockerfile 中为数据库数据声明一个 VOLUME,这强制将数据存储在卷中。这意味着重要的是你不能像这样在图像中设置数据;您必须在外部填充数据,然后将数据树复制到 Docker 镜像系统之外。

关于sql-server - 仅使用 Dockerfile 创建具有已恢复备份数据库的 SQL Server docker 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69494154/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com