apko不依赖dockerfile基于apk 包构建oci 镜像的工具
Posted rongfengliang-荣锋亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了apko不依赖dockerfile基于apk 包构建oci 镜像的工具相关的知识,希望对你有一定的参考价值。
可以方便的基于apk 包进行oci 镜像的构建以及发布
包含的特性
- 可重复执行同时确认二进制文件一致
- 快速
- 小
- sbom 支持
- 服务支持,基于s4
安装
可以通过go install 以及docker 模式运行
go install chainguard.dev/apko@latest
使用
- 配置
contents:
repositories:
- https://mirrors.aliyun.com/alpine/edge/main
packages:
- alpine-base
- curl
- tree
- tzdata
entrypoint:
command: /bin/sh -l
paths:
- path: /etc/localtime
type: symlink
source: /usr/share/zoneinfo/Hongkong
# optional environment configuration
environment:
PATH: /usr/sbin:/sbin:/usr/bin:/bin
- 构建
命令格式apko build <config.yaml> <tag> <output.tar>
apko build app-base.yaml dalongdemoapp:v1 dalongdemoapp.tar
效果(可以看到会包含各种系统的)
- 加载镜像
docker load < dalongdemoapp.tar
效果
- 运行
docker run -it dalongdemoapp:v1-amd64
效果
说明
基于apko 构建镜像是一个不错的选择,还是比较方便的,同时也支持方便的sbom 可以增强安全处理
参考资料
Alpine Dockerfile --no-cache Vs 的优势。 rm /var/cache/apk/*
【中文标题】Alpine Dockerfile --no-cache Vs 的优势。 rm /var/cache/apk/*【英文标题】:Alpine Dockerfile Advantages of --no-cache Vs. rm /var/cache/apk/* 【发布时间】:2018-08-13 14:06:01 【问题描述】:在使用 Alpine 映像创建 Dockerfile 时,我经常看到使用 apk --no-cache
,其他时候它被提交,而我看到的是 rm /var/cache/apk/*
。
我很想知道使用--no-cache
消除了以后使用rm /var/cache/apk/*
的需要。我也想知道一种风格是否比另一种更受欢迎。
【问题讨论】:
我的理解是,--no-cache
就在那里,所以你以后不必必须做rm /var/cache/apk/*
作为更新,使用Buildkit,您现在可以通过使用RUN --mount=type=cache...
将这些缓存安装到您的主机,让您的APK 等缓存疯狂运行,而无需重复下载或增加您的图像大小。 apt
示例 here
【参考方案1】:
--no-cache
选项允许不在本地缓存索引,这对于保持容器较小很有用。
从字面上看,它等于开头的 apk update
和结尾的 rm -rf /var/cache/apk/*
。
我们使用--no-cache
选项的一些示例:
$ docker run -ti alpine:3.7
/ # apk add nginx
WARNING: Ignoring APKINDEX.70c88391.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.5022a8a2.tar.gz: No such file or directory
ERROR: unsatisfiable constraints:
nginx (missing):
required by: world[nginx]
/ #
/ # apk add --no-cache nginx
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/2) Installing pcre (8.41-r1)
(2/2) Installing nginx (1.12.2-r3)
Executing nginx-1.12.2-r3.pre-install
Executing busybox-1.27.2-r7.trigger
OK: 6 MiB in 13 packages
/ #
/ # ls -la /var/cache/apk/
total 8
drwxr-xr-x 2 root root 4096 Jan 9 19:37 .
drwxr-xr-x 5 root root 4096 Mar 5 20:29 ..
另一个不使用--no-cache
选项的例子:
$ docker run -ti alpine:3.7
/ # apk add nginx
WARNING: Ignoring APKINDEX.70c88391.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.5022a8a2.tar.gz: No such file or directory
ERROR: unsatisfiable constraints:
nginx (missing):
required by: world[nginx]
/ #
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
v3.7.0-107-g15dd6b8ab3 [http://dl-cdn.alpinelinux.org/alpine/v3.7/main]
v3.7.0-105-g4b8b158c40 [http://dl-cdn.alpinelinux.org/alpine/v3.7/community]
OK: 9048 distinct packages available
/ #
/ # apk add nginx
(1/2) Installing pcre (8.41-r1)
(2/2) Installing nginx (1.12.2-r3)
Executing nginx-1.12.2-r3.pre-install
Executing busybox-1.27.2-r7.trigger
OK: 6 MiB in 13 packages
/ #
/ # ls -la /var/cache/apk/
total 1204
drwxr-xr-x 2 root root 4096 Mar 5 20:31 .
drwxr-xr-x 6 root root 4096 Mar 5 20:31 ..
-rw-r--r-- 1 root root 451508 Mar 3 00:30 APKINDEX.5022a8a2.tar.gz
-rw-r--r-- 1 root root 768680 Mar 5 09:39 APKINDEX.70c88391.tar.gz
/ #
/ # rm -vrf /var/cache/apk/*
removed '/var/cache/apk/APKINDEX.5022a8a2.tar.gz'
removed '/var/cache/apk/APKINDEX.70c88391.tar.gz'
如您所见,这两种情况都有效。至于我,使用--no-cache
选项更优雅。
【讨论】:
我同意--no-cache
更优雅。但是使用多个apk add --no-cache
命令,每次都会下载索引文件。在这种情况下,在顶部执行apk update
,然后在底部附近执行rm -rf /var/cache/apk/*
会减少网络聊天。当某些软件包添加了 --virtual
而有些没有添加时,这真的很重要。
@lilole 你不能把多个apk add
命令合并成一个命令吗?
@PaulCalabro 我们的 Dockerfile 在我的工作中总是使用一个 apk add
。但是--virtual
选项有点简洁,它确实在多次apk add
调用中大放异彩。但是从长远来看,我们可能会在 --virtual
真正使我们受益之前转向多阶段 Dockerfile。
如果我在 debian 映像上使用 apt-get
,--no-cache
的等价物是什么?【参考方案2】:
我认为这是一种设计风格。缓存的本质是复用,比如多个容器可以挂载同一个缓存文件系统,而不需要从网络上重复下载。
可以查看apline wiki:https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management#Local_Cache
【讨论】:
apk 清单是如此高效,我认为共享缓存的努力是不值得的,尤其是因为您每次都必须更新缓存才能获得最新版本。也可以在 docker 中根本不缓存 如果您使用 docker,最好在每个 apk 添加中使用 no-cache 选项,而不是在最后,如果您有一个安装所有您需要避免创建 docker 层的文件,则更好以上是关于apko不依赖dockerfile基于apk 包构建oci 镜像的工具的主要内容,如果未能解决你的问题,请参考以下文章