我有一个dockerfile,其中从主机复制了一个7GB SQL Server数据库bak文件,这增加了构建上下文。如果在.dockeringore中忽略bak文件,则COPY失败,如预期的那样。如何在不增加构建上下文的情况下处理此问题?
我的文件夹结构是
C:\proj
artifacts (contains sql bak file)
docker (contains dockerfile)
scripts (contains powershell script for restoring db)
PS C:\proj> docker image build -t testdb:v14 -f .\docker\wcp_db.dockerfile .
在这里,构建上下文包括bak文件,并且图像大小增加了。
Sending build context to Docker daemon 7.196GB
如果我添加.gitignore以跳过工件文件夹或跳过bak文件,则会减少构建上下文。
Sending build context to Docker daemon 11.26kB
但是,COPY
失败了,因为.gitignore
从上下文中忽略了文件夹/文件。
Step 5/6 : COPY ./artifacts/testDB.bak .
COPY failed: CreateFile \\?\C:\ProgramData\Docker\tmp\docker-builder101517566\artifacts\testDB.bak: The system cannot find the file specified.
我相信,我们不能复制构建上下文之外的文件。
我的dockerfile在下面:
#escape = `
FROM microsoft/mssql-server-windows-express:latest
ENV ACCEPT_EULA="Y" `
sa_password="someSApwd012#"
WORKDIR C:\workspace
COPY ./scripts/DeployDatabase.ps1 .
COPY ./artifacts/testDB.bak .
CMD powershell ./DeployDatabase.ps1 -sa_password $env:sa_password -dbName 'testDB' -serverName ".\sqlexpress" -sourceBackupFolder "C:\workspace" -Verbose
如何处理这种情况,我仍然可以复制bak文件,并使构建上下文保持在最低限度?
答案 0 :(得分:3)
通常使用.Dockerignore文件对构建上下文进行过滤。如果图像需要使用bak,则必须将其显示在buildcontext AFAIK中。
一种克服它的方法是提供一些在运行时下载bak文件的方法。在这种情况下,您将必须修改CMD以运行一些脚本,该脚本首先下载文件,然后运行DB部署脚本。
在这种情况下,图像将很小,构建速度会更快。但是,这并不是真正意义上的docker生态系统,而是更多关于如果您的情况下可以接受缺少备份映像的情况,您希望如何运行部署过程