以下 Docker 文件创建自定义 SQL Server 镜像,并从备份 (rmsdev.bak) 恢复数据库。
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' 文件。
在构建场景中,多阶段 Dockerfile 不易适用于此案例。另一种方法是运行容器,恢复备份,然后提交一个新的镜像,但我想要做的是仅使用正确的Dockerfile和docker build。
有人知道怎么做吗?