【问题标题】:How to deploy a self-building Docker image to make changes to itself in respect to the local environment?如何部署一个自建的 Docker 镜像来对本地环境进行自身的更改?
【发布时间】:2015-10-17 16:24:08
【问题描述】:

简单回顾一下,docker 是一种为特定 Web 服务、运行环境、虚拟机编写代码或配置文件更改的方式,所有这些都来自 linux 终端/文本文件的舒适范围。 Docker 镜像是代码层的保存点,这些代码层由 dockerfile 构成,或者可以从需要基本镜像才能创建的容器中创建。 Dockerfile 可作为一种自动化构建过程的方式,通过运行所有需要的命令和操作来生成任何新容器并将它们滚动到一个文件中,从而自动生成映像。

现在这很好,但我想更进一步。构建镜像,尤其是那些有依赖关系的镜像很麻烦,因为 1,你必须依赖默认操作系统镜像中不存在的命令,或者 2,有很多其他不需要的无用命令。

现在在我的脑海中,我觉得这是可能的,但我还不能建立联系。 我的愿望是让 dockerfile 从头开始​​构建自己(字面意思是从头开始的图像)并根据自己构建自己。它是复制任何所需的依赖项,例如 rpm 或其他东西,安装它,找到它的启动命令,并将成功创建和运行映像所需的所有依赖项传递回 docker 文件。 在编程意义上,

FROM scratch
COPY package.rpm
RUN *desired cmds*

运行错误被反馈到一个文件中。 file 在当前操作系统中搜索所需的依赖项并将它们返回给 RUN cmd。

CMD *service start up*

至于该 CMD,我们将运行该服务,并获取其状态并将其过滤回其启动命令返回 CMD 部分。

这里的问题是我不相信我可以使用 docker 来达到这些目的。要对某物进行 docker 构建,保留其错误并将其再次过滤回构建中,这似乎具有挑战性。我希望 docker 可以配备此功能,因为我执行此类任务的唯一机会似乎是通过对可移植性因素造成严重破坏的脚本。

有什么想法吗?

【问题讨论】:

  • 从某种意义上说,我想自动化 dockerfiles 的自动化构建。
  • 我知道我能做什么,但需要一些准备工作。首先,我可能必须对要构建映像的机器进行最小安装。这意味着仅将终端放在特定的 VM 上。使用那个最小的安装,我可以通过删除所有不需要的命令来扭转这个过程,但我仍然需要筛选包以找出它需要什么......我被告知它更容易建立而不是摧毁,但现在我不太确定。我知道在 dockerfile 中我可以运行特定的命令,但是我如何知道整个服务需要哪些命令?

标签: linux docker dockerfile


【解决方案1】:

对我来说,这听起来更像是一个供应系统、厨师或傀儡。如果您必须留在码头区,我知道有些人会使用它们来创建图像。

【讨论】:

  • 我想我可能不得不做这样的事情。我还没有精通他们的语言,所以我只想仔细检查并再次询问以确保。 因此,使用 dockerfile 尝试构建映像,它发现它无法运行命令,因此它返回本地系统,找到该命令并将其转发回 docker 文件,它将继续构建自身,直到不需要更多文件来运行包?你认为像厨师或木偶这样的东西会起作用吗?
【解决方案2】:

Docker 不会为您提供无痛构建。 Docker 不知道你想要什么。

你有几个选择:

一个简单的例子:

web:
build: .
volumes:
   - "app:/src/app"
ports:
   - "3030:3000"

使用它:

docker-compose up

Docker compose 将:

  1. 调用容器web
  2. 使用当前工作目录作为根目录构建
  3. app目录挂载到容器中的/src/app
  4. 将集装箱端口3030对外公开为3000。

请注意,build 也可以指向您通过 Kitematic(从 registry.hub.docker.com 读取)找到的 Docker 容器,因此您可以将 .(在上面的构建行示例中)替换为node:latest 它将构建一个 NodeJS 容器。

Docker Compose 与 docker 命令行非常相似。您可以使用https://lorry.io/ 帮助生成 docker-compose.yml 文件。

  • 如果您正在寻找一个史诗般的解决方案,那么我会推荐像 Mesosphere 这样的企业 Docker 环境。

您还可以研究其他解决方案,例如 Google 的 Kubernetes 和 Apache Mesos,但学习曲线会增加。

我还注意到您在使用 IP,虽然我没有使用它,但据我所知,Weave 大大简化了 Docker 的网络方面,这绝对不是 Docker 的强项。

【讨论】:

  • 我学过风筝。它是已经存在的 docker 守护进程的一种更好的形式,它提供了一个 GUI 供用户与之交互。管理 docker 的更好选择。 Docker compose 也属于完全相同的格式。用于管理大量 docker 容器的更好工具,但恐怕我的目标不是这个。我的目标是创建一个图像,当您尝试构建时,它会识别出它无法找到使用运行命令所需的某个文件。它将这个依赖转发回机器,它可以在其中找到它并将其添加到 docker 文件中。
  • 这不是企业公司的做法。他们自动化构建,然后只担心构建失败。你确实意识到 docker 本质上只是一个档案,对吧?你是说你想要一些东西来自动化复制文件的简单自动化。一个人必须在某个地方参与这个过程。自动化堆栈的顶端总是有一位工程师。
  • 人与机器。人制造机器,机器被赋予复制自身的能力。你知道有一种病毒可以在野外完全重写它的编码吗?如果有人可以做如此复杂的事情,那么有人也应该能够制作脚本或可以将这些所需的依赖项附加到 dockerfile 的东西。我已经制作了一个基本的。获取失败的 dockerfile 的错误代码,greps 文件路径,将该路径复制到新的 dockerfile,尝试构建该 dockerfile,并从中获取依赖项,依此类推。
  • 唯一的缺点是它被用在一个脚本中,该脚本基于它所基于的操作系统。这就是为什么我要问是否有某种东西或某种方法可以复制它并且仍然可以移植到所有环境。
  • 听起来您想用 Java 编写它,因此您的运行 Docker 命令的工具对于主要操作系统来说是跨平台的。我不知道你为什么不只为一个操作系统构建。似乎是在浪费时间和精力,可以专注于其他地方。
猜你喜欢
  • 2015-09-04
  • 2014-08-27
  • 2016-05-18
  • 2022-01-21
  • 1970-01-01
  • 2019-11-26
  • 2021-07-03
  • 2015-08-04
  • 1970-01-01
相关资源
最近更新 更多