在没有安装docker的情况下构建docker镜像

问题描述 投票:3回答:5

是否有可能在没有安装docker的情况下构建映像。在我的项目的maven构建中,我想生成docker图像,但我不想强迫其他人在他们的机器上安装docker。

我可以想到一些安装了docker的虚拟盒子图像,但它是一种沉重的解决方案。有没有办法用一些maven插件来构建图像,一些Go代码或已经准备好的虚拟盒图像用于这个目的?

它归结为如何使用docker而不强迫用户安装任何东西。无论是用于构建还是用于运行docker镜像。

UPDATE

有一些,不是真正最新的maven插件,用于虚拟机配置with vagrantwith vbox。我找到了关于构建docker images without docker on basel的文章到目前为止我看到两个选项要么我可以以某种方式构建图像,要么运行一些带有docker守护进程的VM(不仅可以用于构建,甚至可以用于集成测试)

maven docker build
5个回答
5
投票

我们可以在没有安装Docker的情况下创建Docker镜像。

Jib Maven和Gradle插件

谷歌有一个名为Jib的开源工具,它相对较新,但出于多种原因非常有趣。可能最有趣的是你不需要docker来运行它 - 它使用与docker build相同的标准输出构建图像,但除非你要求它才使用docker - 所以它适用于未安装docker(在构建服务器中并不罕见)。您也不需要Dockerfile(无论如何都会被忽略),或pom.xml中的任何内容来获取Maven中构建的图像(Gradle会要求您至少在build.gradle中安装插件)。

Jib的另一个有趣的特性是它对层的看法,并且它以与上面创建的多层Dockerfile略有不同的方式对它们进行优化。就像在fat jar中一样,Jib将本地应用程序资源与依赖项分开,但它更进一步,并且还将快照依赖项放入单独的层中,因为它们更有可能发生更改。有进一步自定义布局的配置选项。

请参考此链接https://cloud.google.com/blog/products/gcp/introducing-jib-build-java-docker-images-better

例如,使用Spring Boot参考https://spring.io/blog/2018/11/08/spring-boot-in-a-container


1
投票

看看以下工具:

  1. Fabric8-maven-plugin - http://maven.fabric8.io/ - 良好的maven集成,使用远程docker(openshift)集群进行构建。
  2. Buildah - https://github.com/containers/buildah - 没有docker守护进程但没有other pre-requisites

Fabric8-胃插件

fabric8-maven-plugin将您的Java应用程序带到Kubernetes和OpenShift。它提供了与Maven的紧密集成,并从已提供的构建配置中获益。这个插件专注于两个任务:构建Docker镜像和创建Kubernetes和OpenShift资源描述符。

如果你有一个Kubernetes / Openshift集群,fabric8-maven-plugin似乎特别合适。它使用Openshift API构建并可选择将映像直接部署到您的集群。

我能够非常快速地build and deploy他们的zero-config spring-boot示例,没有必要的Dockerfile,只需编写您的应用程序代码,它负责所有的样板。

假设您已经从桌面连接到OpenShift的基本设置,它将把项目.jar打包到容器中并在Openshift上启动它。最小的maven配置是将插件添加到pom.xml build / plugins部分:

<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>fabric8-maven-plugin</artifactId>
    <version>3.5.41</version>
</plugin>

然后使用构建+部署

$ mvn fabric8:deploy

如果您需要更多控制并且更喜欢管理自己的Dockerfile,它也可以处理这个,这在samples/secret-config中显示。


Buildah

Buildah是一种有助于构建Open Container Initiative(OCI)容器映像的工具。该软件包提供了一个命令行工具,可用于:

  • 创建一个工作容器,从头开始或使用图像作为起点
  • 从工作容器或Dockerfile中的指令创建映像
  • 图像可以采用OCI图像格式或传统的上游泊坞窗图像格式构建
  • 挂载工作容器的根文件系统以进行操作
  • 卸载工作容器的根文件系统
  • 使用容器的根文件系统的更新内容作为文件系统层来创建新图像
  • 删除工作容器或图像
  • 重命名本地容器

1
投票

谷歌已经为此发布了Kaniko。它应该作为容器运行,无论是在Kubernetes,Docker还是gVisor中。


0
投票

我不想强迫其他人在他们的机器上安装docker。

如果“没有Docker安装”你的意思是不必在运行构建的每台机器上本地安装Docker,你可以利用Docker Engine API,它允许你从远程主机调用Docker守护进程。

Docker Engine API是一个RESTful API,由HTTP客户端(如wget或curl)或HTTP库(它是大多数现代编程语言的一部分)访问。

例如,Fabric8 Docker Maven Plugin只使用DOCKER_HOST参数。你需要一个最新的Docker版本,你必须正确配置至少一个Docker守护进程,这样才能安全地接受远程请求(这个主题有很多资源,比如official docherehere)。从那时起,您可以远程完成Docker构建,而无需在本地安装Docker。


0
投票

我遇到了同样的问题,我没有找到任何解决方案,因此我开发了odagrun,它是Gitlab的跑步者,集成了注册表api,更新了DockerHub,Microbadger等。

OpenSource并拥有MIT许可证。

非常适合动态创建docker镜像,无需docker守护程序,也不需要root帐户,或者根本不需要任何图像(image:scratch会这样做),目前仍处于开发阶段,但我每天都在使用它。

要求

  1. Gitlab上的项目存储库
  2. 一个openshift集群(openshift-online-starter将适用于大多数中小型集群

提取如何创建此项目的docker镜像:

# create and push image to ImageStream:
build_rootfs:
  image: centos
  stage: build-image
  dependencies:
    - build
  before_script:
    - mkdir -pv rootfs
    - cp -v output/oc-* rootfs/
    - mkdir -pv rootfs/etc/pki/tls/certs
    - mkdir -pv rootfs/bin-runner
    - cp -v /etc/pki/tls/certs/ca-bundle.crt rootfs/etc/pki/tls/certs/ca-bundle.crt
    - chmod -Rv 777  rootfs
  tags:
    - oc-runner-shared
  script:
    - registry_push --rootfs --name=test-$CI_PIPELINE_ID --ISR --config
© www.soinside.com 2019 - 2024. All rights reserved.