如何减少构建上下文

时间:2019-01-22 08:29:04

标签: docker dockerfile

我有一个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文件,并使构建上下文保持在最低限度?

1 个答案:

答案 0 :(得分:3)

通常使用.Dockerignore文件对构建上下文进行过滤。如果图像需要使用bak,则必须将其显示在buildcontext AFAIK中。

一种克服它的方法是提供一些在运行时下载bak文件的方法。在这种情况下,您将必须修改CMD以运行一些脚本,该脚本首先下载文件,然后运行DB部署脚本。

在这种情况下,图像将很小,构建速度会更快。但是,这并不是真正意义上的docker生态系统,而是更多关于如果您的情况下可以接受缺少备份映像的情况,您希望如何运行部署过程