Docker/Containerd
等容器引擎环境下构建简单镜像Pull和Push
时使用 socks5/http
代理Windows
MacOS
Linux
三个平台的使用zstd
解压缩算法curl -L https://github.com/jelipo/ocipack-rs/releases/download/0.6.0/ocipack-0.6.0-amd64_$(uname).tar.gz | tar xzv
# 把下载解压完成的 `ocipack` 放到 `/usr/local/bin/` (可选操作)
sudo cp ocipack /usr/local/bin/ && sudo chmod +x /usr/local/bin/ocipack
curl.exe -L https://github.com/jelipo/ocipack-rs/releases/download/0.6.0/ocipack-0.6.0-amd64_windows.zip -o ocipack.zip
tar -xf ocipack.zip
作者在学习云原生和写代码的时候,经常需要构建一个简单的镜像,但是有时候会因为各种原因导致并不轻松。
Docker/Containerd
等环境。Docker
,这意味着虚拟机中的Docker
无法通过宿主的VPN网络Pull和Push
镜像。Linux
服务器上,Docker
/Containerd
等引擎在构建时拉取公共镜像因为众所周知的原因速度非常慢。即使有socks5/http
代理,但是服务器上可能还有正在运行的容器化进程,配置代理意味着可能要重启,且整个容器引擎都会走代理,一般是不可接受的,况且频繁配置也很麻烦。CI/CD
环境中,你可能可以使用Docker多阶段构建
、CI工具提供的环境
构建一个镜像并打包成Image
并上传到Registry
中。构建产物
和构建成镜像并Push
,但是有时候CI环境并不如我们的意(可能没有容器环境、只有Docker in Docker
无法Push 等问题),而且需要学习每个CI环境来完成我们的这两个步骤。产物
构建成镜像并Push到Registry
就可以大大提升我们对不同CI环境的兼容。针对以上问题,所以写了一个小工具去解决这些问题。
也有很多别的工具可以解决,重复造轮子的目的,也是为了加深Rust的编写能力和Image知识。
因为本工具没有任何Runtime,所以Dockerfile配置项中需要Runtime支持的一律无法正常支持。
为了便于上手使用,本工具只是使用常见的Dockerfile作为配置,降低使用门槛,但并不是完全兼容Dockerfile
Filed | |
---|---|
支持的配置项 |
FROM LABEL CMD COPY ENV USER WORKDIR EXPOSE
|
暂不支持但未来会支持 |
ADD (可以暂时用COPY代替) ENTRYPOINT VOLUME
|
不会支持 |
ARG RUN MAINTAINER
|
多阶段构建 | 不支持 |
目前的Image Manifest主流为Docker,但是Docker
Manifest格式也分为多个版本,本工具对于Docker格式只支持Image Manifest V 2, Schema 2
,对于老版本的Image Manifest V 2, Schema 1
不支持,也不计划进行支持。
版本 | 是否支持 |
---|---|
Image Manifest V 2, Schema 2 |
✅ |
Image Manifest V 2, Schema 1 |
❌ |
OCI Image Manifest |
✅ |
很多时候,我们需要的功能只是把文件COPY进Base Image
,然后运行。
创建一个Dockerfile
文件,这个Dockerfile
既是我们构建Image的配置文件,也是我们计划运行我们构建好的镜像时打印内容的文件。写入以下内容:
FROM ubuntu:22.04
COPY Dockerfile /root/
CMD cat /root/Dockerfile
接着运行以下命令:
./ocipack build \
--source=dockerfile:./Dockerfile \
--target=registry:my.harbor.com/jelipo/demo:v1 \
--target-auth=jelipo:my_password
如果顺利,末尾将会输出:
Build job successful!
Target image:
my.harbor.com/jelipo/demo:v1
当看到Build job successful
字样时,说明我们已经构建完成并上传到了Registry
。
接下来我们执行docker run -it --rm my.harbor.com/jelipo/demo:v1
时会输出我们的Dockerfile
文件的内容。
如果只需要下载镜像保存到文件,可以把 --target
参数改为 tgz:file_path
,还可以使用socks5代理访问。
./ocipack build \
--source=registry:redis:latest \
--target=tgz:redis.tgz \
--source-proxy=socks5://127.0.0.1:1080
最主要的功能,拉取Base Image,然后把文件COPY进Image,然后Push。
使用ocipack build
子命令。
# 当base image的registry为http而非https时需要启用
-a, --allow-insecure
Allow insecure registry
# 连接超时时间
--conn-timeout <CONN_TIMEOUT>
[OPTION] Connection timeout in seconds [default: 600]
# 新Image的格式
-f, --format <FORMAT>
[OPTION] Target format type. Support 'docker' and 'oci' [default: docker]
# 指定Dockerfile的路径
-s, --source <SOURCE>
Source type. Support dockerfile type Example:'dockerfile:/path/to/.Dockerfile'
# Base Image的auth验证信息,支持环境变量
--source-auth <SOURCE_AUTH>
[OPTION] Auth of pull source image. Example:'myname:mypass','myname:${MY_PASSWORD_ENV}'
# Base Image的代理信息
--source-proxy <SOURCE_PROXY>
[OPTION] Proxy of pull source image.
Example:'socks5://127.0.0.1:1080','http://name:pass@example:8080'
# Target Image的信息
-t, --target <TARGET>
Target type. Support registry/tar/tgz. Example:'registry:my.container.com/target/image:1.1','tgz:image.tgz'
# 当Target Image的Registry为http而非https时需要启用
--target-allow-insecure
Allow target insecure registry
# Target Image的auth验证信息,支持环境变量
--target-auth <TARGET_AUTH>
[OPTION] Auth of push target image. Example:'myname:mypass','myname:${MY_PASSWORD_ENV}'
# Target Image的代理信息
--target-proxy <TARGET_PROXY>
[OPTION] Proxy of push target image.
Example:'socks5://127.0.0.1:1080','http://name:pass@example:8080'
# 新layer使用zstd压缩,zstd拥有更好的 解压缩速度 和 压缩比(很多Runtime不支持zstd,谨慎使用)
--use-zstd
[OPTION] Compress files using zstd
如果是hub.docker.com
中的公共镜像,因为网络原因本身就很慢,可以使用--source-proxy
设置一个代理加速访问。
目前大多数容器引擎或者工具都会默认使用HTTPS
访问Registry
,但是很多内网或者学习使用时会使用HTTP
协议的 Registry 。
当 Pull 镜像的Registry是HTTP
协议,添加--allow-insecure
选项。
如果 Push 的Registry是HTTP
协议,添加--target-allow-insecure
选项。
本工具支持从环境变量中读取密码,可以在build
子命令的help中看--source-auth
或者--target-auth
的说明。
添加--format=oci
选项。
此功能主要是为了 Docker和OCI 之间的转换。主要命令跟build
子命令大同小异,可以参考上面的构建(Build)
。
可以使用ocipack transform -h
查看详情。
因为无论 Pull 还是 Push ,都会需要缓存到本地,以便下次 Pull 时的加速。
可以使用ocipack clean
子命令清理本地的缓存文件夹,可以使用ocipack clean -h
查看更多参数选项。
当你想查看Registry中的Image信息,但是又无从下手的时候,可以使用此命令查看详细信息。
例如ocipack show-info -i registry:nginx:latest
查看nginx:latest的详细信息。
zstd
压缩所有layer。
感谢使用,如有问题请反馈。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。