1 Star 20 Fork 3

jelipo / ocipack-rs

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

ocipack


一个可以快速构建 OCI/Docker 镜像的工具

GitHub last commit GitHub release (latest by date) GitHub all releases GitHub repo size Github Release Publish Status License

特性

  • 在没有Docker/Containerd等容器引擎环境下构建简单镜像
  • 兼容 Dockerfile 大部分配置项,降低上手难度
  • 支持 OCI 和 Docker 镜像格式,并支持互相转换
  • 支持镜像Pull和Push时使用 socks5/http 代理
  • 一个单独的二进制,Linux下静态编译无依赖,alpine也可使用
  • 支持 Windows MacOS Linux 三个平台的使用
  • 支持性能非常好的zstd解压缩算法

下载和安装

Linux 和 MacOS

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

Windows

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等环境。
  • 居家办公需要连接VPN到组织的网络中,但是 Windows 和 MacOS 使用虚拟机运行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

功能

构建(Build)

最主要的功能,拉取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

可能遇到的问题

Base Image 拉取非常慢

如果是hub.docker.com中的公共镜像,因为网络原因本身就很慢,可以使用--source-proxy设置一个代理加速访问。

Pull 或 Push 的 Registry 不支持HTTPS协议

目前大多数容器引擎或者工具都会默认使用HTTPS访问Registry,但是很多内网或者学习使用时会使用HTTP协议的 Registry 。

当 Pull 镜像的Registry是HTTP协议,添加--allow-insecure选项。

如果 Push 的Registry是HTTP协议,添加--target-allow-insecure选项。

执行命令后,在Linux history中会显示我的密码

本工具支持从环境变量中读取密码,可以在build子命令的help中看--source-auth或者--target-auth的说明。

构建出来的Image是Docker Manifest格式的,想要OCI格式的

添加--format=oci选项。

转换(Transform)

此功能主要是为了 Docker和OCI 之间的转换。主要命令跟build子命令大同小异,可以参考上面的构建(Build)
可以使用ocipack transform -h查看详情。

清理缓存(Clean)

因为无论 Pull 还是 Push ,都会需要缓存到本地,以便下次 Pull 时的加速。

可以使用ocipack clean子命令清理本地的缓存文件夹,可以使用ocipack clean -h查看更多参数选项。


查看Image信息(Show Info)

当你想查看Registry中的Image信息,但是又无从下手的时候,可以使用此命令查看详细信息。

例如ocipack show-info -i registry:nginx:latest查看nginx:latest的详细信息。


挖坑

  • 支持导出或者导入本地的容器引擎。
  • 更多的Dockerfile配置项。
  • 创建新Image时提供 使用zstd压缩所有layer。

最后

感谢使用,如有问题请反馈。

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

🚅 无需Runtime快速构建简单OCI/Docker镜像 展开 收起
Rust
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Rust
1
https://gitee.com/jelipo/ocipack-rs.git
git@gitee.com:jelipo/ocipack-rs.git
jelipo
ocipack-rs
ocipack-rs
master

搜索帮助