问题标签 [docker-layer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
685 浏览

docker - 我可以获取非最终阶段 Docker 构建的 Docker 层历史吗?

我正在研究一种在 CircleCI 中进行 Docker 层缓存的方法,并且我有一个可行的解决方案。但是,我正在努力改进它。任何形式的 CI 的问题是每次构建都会擦除映像历史记录,因此需要使用 CI 系统的缓存指令确定要恢复哪些文件,然后将哪些文件load返回到 Docker。

首先我尝试了这个,灵感来自Travis 的这种方法。恢复:

并创建:

这似乎工作正常,但我Dockerfile使用的是两阶段构建,一旦我COPY从第一个到最终编辑文件,它就停止引用缓存。我认为这是因为 (a)docker history仅适用于最终构建,并且 (b) 第一个构建阶段中的非缓存更改具有 new mtime,因此当它们被复制到最终阶段时,它们被视为新的。

为了解决这个问题,我决定尝试将所有图像保存到缓存中:

这行得通!但是,它有一个新问题:当我修改 my 时Dockerfile,会加载旧图像缓存,添加新图像,然后将所有内容都存储在缓存中。这将累积我再也不需要的死层,大概直到达到 CI 提供者的缓存大小限制。

我认为这可以通过缓存构建的所有阶段来解决,但我不确定如何引用第一阶段。是否有一个我可以运行的命令,类似于docker history -q -a,它将为所有非最后阶段(因为我已经可以完成最后一个阶段)或包括最后阶段在内的所有阶段提供哈希值?

我希望docker build -q可以这样做,但它只打印最终哈希,而不是所有中间哈希。

更新

我有一个不优雅的解决方案,它确实有效,但肯定有比这更好的方法!我搜索docker buildfor的输出--->,这是 Docker 宣布层哈希和缓存信息的方式。我去掉了缓存消息和箭头,只留下了所有构建阶段的完整构建层哈希列表:

(我实际上做了两次构建——一次是正确的构建 CI 步骤,第二次是收集哈希值。我可以只做一次,但是在单独的步骤中进行实际构建感觉很好。第二次构建将总是被缓存,并且只需要几秒钟即可运行)。

这可以改进吗,也许使用 Docker 命令?

0 投票
0 回答
108 浏览

docker - 是否可以“重置” Docker 容器的读/写层?

在阅读有关容器及其层(https://docs.docker.com/storage/storagedriver)的信息时,我想到了以下问题:

是否可以“重置” Docker 容器的读/写层?通过“重置”,我的意思是删除容器可能已写入该层的所有状态——这样我就可以得到一个“全新容器”,必须启动一个新容器。

0 投票
0 回答
29 浏览

docker - Docker保存镜像差异

我正在使用 Docker 部署我的应用程序。

但是出于安全原因,我有一些客户端不允许我连接到任何 docker 存储库。

为了进行部署,我将所有图像保存在一个文件中:

在进行部署时,我正在使用docker load

有什么方法可以只保存从以前版本更改的图层?

0 投票
1 回答
91 浏览

docker - Docker镜像层验证

我需要了解 docker 镜像注册表的离线使用情况。

当从微软官方站点拉取 docker 镜像,调整,然后推送到注册表时,它是完整的镜像还是缺少层?

当其他主机从注册表中提取可能脱机使用的映像时,客户端主机是否仍需要 Internet 连接才能从 Microsoft 服务器中提取丢失/秘密层?(或者它是从微软提取并随后推送到注册表的完整图像?)

签名呢?是否会为每一层自动更新,当调整镜像时,存储在其中的应用程序等,以便其他客户端从本地注册表中提取调整后的镜像时不会出现验证错误?

0 投票
5 回答
11154 浏览

azure-devops - 如何在 Azure DevOps 中启用 Docker 层缓存

我正在运行以下 yaml 脚本来构建 docker 映像并推送到 kubernetes 集群,但同时我想在构建 yaml 脚本时在 azure DevOps 中启用 docker 层缓存。请您解释一下如何启用或如何添加azure devops 中的任务来执行此操作。

yaml:

0 投票
2 回答
288 浏览

docker - 告诉 Docker 构建忽略 RUN 命令顺序的更改

假设我们有这个:

我们改变顺序:

缓存将完全失效。有没有办法告诉docker build依赖的顺序无关紧要。像这样的一些语法:

0 投票
2 回答
303 浏览

docker - 层数是否对当前和未来 docker 镜像的大小、设置时间或性能有影响?

假设我有 2 个选项来添加 docker 层。

选项1:

选项2:

我知道第二个选项增加了 3 层,而第一个选项只增加了 1 层。

层数是否对当前和未来 docker 镜像的大小、设置时间或性能有影响?

注意:当前是指当前图像。未来意味着任何可能使用现有图像中的某些层的图像,从而加快设置速度。

0 投票
1 回答
432 浏览

docker - 无法共享 docker 构建之间的层

我想通过以下方式在两台不同的机器上重用 docker 映像中的层:

  • 构建映像 (1)
  • 将图像推送到注册表 (1)
  • 从注册表中提取图像 (2)
  • 构建相同的 docker 镜像并从拉取的镜像中重用层 (2)

所以,

机器 1

我构建了以下图像:

  • 使用以下命令构建此映像:docker build . -t <registry>/test-docker-image:latest
  • 将图像推送到注册表:docker push <registry>/test-docker-image:latest

机器 2

  • 从注册表中拉取镜像:docker pull <registry>/test-docker-image:latest

如果我docker build .在这台机器上运行,则不会从拉取的图像中重用图层。

有没有办法重用拉取图像中的图层docker build

类似问题

GitHub 上有以下线程描述了类似的内容,但这描述了在 和 之间共享层之间的docker build问题docker-compose buildhttps://github.com/docker/compose/issues/883

0 投票
0 回答
48 浏览

docker - 完全删除基于 Ubuntu 的 docker 容器以及 MySQL 和 JDK 的底层

我使用 Ubuntu 16.04 xenial 作为基础镜像创建了自定义 docker 镜像,并在其上安装了 JDK-1.8 和 MY-SQL 层。以下是我的 Dockerfile 创建图像的示例快照。

对于构建映像和创建容器,一切都按预期工作。

但是每当我尝试删除使用此映像创建的 Docker-Container 时。它不会删除其中的 MY-SQL 层。

我使用$ docker rm mycontainer mycontainer命令删除使用上图创建的容器。

但是当我使用上面的图像重新创建容器时(也使用--force-recreate选项),我能够在 MySql 数据库中看到我以前的数据。这意味着$ docker rm不能完全移除带有底层的容器。

有没有办法完全删除 docker-container,包括它的 MySQL 或 JDK 底层?

提前致谢。

0 投票
2 回答
61 浏览

kubernetes - Docker Image 和它的 Kubernetes Pod 不同

我修改了 Docker-Image 中的内容并运行它的 Kubernetes Pod。但是,Kubernetes Pod 包含旧版本 Docker Image 的内容,而不是修改后的内容。

这怎么可能?

我猜 K8s 工作节点正在尝试从本地获取尽可能多的层,而从 docker-registry 中只获取很少的层。如何解决这个问题,使得每次 K8s 工作节点仅从 Registry 中拉取 docker 镜像的所有层?