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

时间:2017-12-08 06:37:39

标签: maven docker build

在没有安装docker的情况下以某种方式构建映像是否可行。在我的项目的maven构建中,我想制作码头图像,但我不想强迫其他人在他们的机器上安装docker。

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

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

更新

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

5 个答案:

答案 0 :(得分:4)

我们可以在不安装Docker的情况下创建Docker映像。

Jib Maven和Gradle插件

Google有一个名为Jib的开源工具,它相对较新,但是 有很多原因,这很有趣。可能是最有趣的 问题是您不需要docker来运行它-它使用以下命令构建映像 与您从docker build获得的标准输出相同,但未使用 docker除非您要求-否则它可以在docker是 未安装(在构建服务器中并不罕见)。您也不需要 Dockerfile(无论如何都会被忽略),或者您pom.xml中的任何内容 获取在Maven中构建的映像(Gradle将要求您至少安装 build.gradle中的插件)。

Jib另一个有趣的功能是对 层,并以与多层 上面创建的Dockerfile层。就像在胖胖的罐子里一样,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)

看看以下工具:

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

Fabric8-maven-plugin

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构建/插件部分:

<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是有助于构建开放式容器倡议(OCI)容器映像的工具。该软件包提供了一个命令行工具,可用于:

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

答案 2 :(得分:1)

Google为此发布了Kaniko。无论是在Kubernetes,Docker还是gVisor中,它都应作为容器运行。

答案 3 :(得分:0)

  

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

如果“没有安装Docker ”是指而无需在运行构建的每台计算机上本地安装Docker ,则可以利用允许的Docker Engine API你从远方的主机上调用Docker守护进程。

  

Docker Engine API是由HTTP客户端访问的RESTful API   作为wget或curl,或者是最现代化的HTTP库   编程语言。

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

答案 4 :(得分:0)

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

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