用于显示或列出生成上下文的Docker命令/选项

rvpgvaaj  于 2023-01-29  发布在  Docker
关注(0)|答案(6)|浏览(162)

是否有命令/选项可显示或列出发送到Docker守护程序以构建映像的上下文?

$ docker build -t "image-name"
Sending build context to Docker daemon 8.499 MB
...

通过在.dockerignore文件中指定模式,可以将文件和目录排除在构建上下文之外。我想我所寻找的内容相当于测试.dockerignore,以及Docker在确定上下文时使用的任何其他利基规则。

q35jwt9p

q35jwt9p1#

上面的答案很好,但是对于大多数情况有一个低技术的解决方案-ncdu。这个实用程序将显示漂亮的和交互式的树结构与大小。它有一个选项,将采取模式从一个文件和排除他们从扫描。所以你可以只做ncdu -X .dockerignore。你会得到这样的东西:

这与你在Docker图像中得到的非常接近。一个警告是,如果你在图像中添加一个点目录(如.yarn),它将不会在ncdu输出中显示。

gijlo24d

gijlo24d2#

唯一的方法是将当前目录添加到特定目录并列出它。
尝试使用此Dockerfile进行构建:

FROM busybox

RUN mkdir /tmp/build/
# Add context to /tmp/build/
COPY . /tmp/build/

构建时使用:

docker build -t test .

列出/tmp/build中的所有文件和目录:

docker run --rm -it test find /tmp/build
fumotvh3

fumotvh33#

从版本18.09开始,Docker有一个使用BuildKit后端导出上下文数据的选项。
默认情况下不启用,因此需要在调用docker build命令之前设置环境变量DOCKER_BUILDKIT=1
如果当前目录中没有任何Dockerfile,以下命令也可以工作。

printf 'FROM scratch\nCOPY . /' | DOCKER_BUILDKIT=1 docker build -f- -o context .

当您多次运行时,请记住删除之前使用rm -r context导出的内容。
您还可以将上下文数据作为归档文件获取,然后使用archivemount命令进行装载:

printf 'FROM scratch\nCOPY . /' | DOCKER_BUILDKIT=1 docker build -f- -o- . > context.tar
mkdir context
archivemount context.tar context

通过这两种方法,您可以使用ncdu context来探索结果。

n3h0vuf2

n3h0vuf24#

更新答案:自2017年以来,Docker建议使用COPY而不是ADD,并加上@tlrobinson的注解,更简单的Dockerfile看起来如下所示:

# debug and list the docker build context so that you can minimmize it
#
# usage:
#  docker build -f docker/context.Dockerfile -t test/buildcontext .
#
######################
FROM busybox

RUN mkdir /tmp/build/
# Add context to /tmp/build/
COPY . /tmp/build

# this last command outputs the list of files added to the build context:
RUN find /tmp/build/
vawmfj5a

vawmfj5a5#

对我有效的是执行以下操作(基于此article)。
1.告诉Docker使用旧的构建工具包。在PowerShell中,这是:
$ENV:对接器构建套件=0
1.运行Docker构建,以便它报告正在进行的所有进度:
Docker构建--进度=普通BLAH
有了这两件事,你就可以在Docker文件中做一些像这样简单的事情:

RUN ls /app

这将给予您提供/app文件夹中所有内容的列表。

bq8i3lrv

bq8i3lrv6#

下面是一个脚本,它将docker build发送的上下文tarball输出到Docker守护进程。

#!/usr/bin/python3

from http.server import BaseHTTPRequestHandler
from re import match
from socketserver import UnixStreamServer
from subprocess import Popen, DEVNULL
from sys import exit, stdout
from tempfile import TemporaryDirectory

class ContextDumper(BaseHTTPRequestHandler):
    def __init__(self, request, client_address, server):
        # provide dummy client address for error reporting
        super().__init__(request, ('docker_context', 0), server)
        
    def do_HEAD(self):
        if self.path != '/_ping':
            self.send_error(404, '/_ping only')

    do_GET = do_HEAD

    def do_POST(self):
        if match(r'/v1\.\d+/build\?', self.path) is None:
            self.send_error(404, '/v1.X/build only')
            exit(1)
        total = 0
        while True:
            chunk_length = int(self.rfile.readline().strip(), 16)
            total += chunk_length
            chunk = self.rfile.read(chunk_length)
            stdout.buffer.write(chunk)
            self.rfile.readline()
            if chunk_length == 0:
                break
        padding = (512 - (total % 512)) % 512
        stdout.buffer.write(bytes(padding))
        exit(0)

with TemporaryDirectory() as tmpdir:
    socket_path = tmpdir + '/docker_context.sock'
    fake_dockerd = UnixStreamServer(socket_path, ContextDumper)
    with Popen(['docker', f'--host=unix://{socket_path}', 'build', '--file=/dev/null', '.'],
               stdout=DEVNULL, stderr=DEVNULL) as builder:
        fake_dockerd.serve_forever()

相关问题