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 可以增强安全处理

参考资料

https://github.com/chainguard-dev/apko

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 镜像的工具的主要内容,如果未能解决你的问题,请参考以下文章

Dockerfile基本指令

Alpine Dockerfile --no-cache Vs 的优势。 rm /var/cache/apk/*

怎么把后缀apk改exe

基于alpine镜像构建的步骤

基于alpine镜像构建的步骤

DockerFile 编译语法详解