有没有办法将 Docker 映像组合到 1 个容器中?

新手上路,请多包涵

我现在有一些 Dockerfile。

一个用于 Cassandra 3.5,它是 FROM cassandra:3.5

我也有一个用于 Kafka 的 Dockerfile,但它要复杂得多。它是 FROM java:openjdk-8-fre 它运行一个很长的命令来安装 Kafka 和 Zookeeper。

最后,我有一个使用 SBT 的 Scala 编写的应用程序。

对于那个 Dockerfile,它是 FROM broadinstitute/scala-baseimage ,它得到了我需要的 Java 8、Scala 2.11.7 和 STB 0.13.9。

也许,我不明白 Docker 是如何工作的,但是我的 Scala 程序将 Cassandra 和 Kafka 作为依赖项,出于开发目的,我希望其他人能够简单地使用 Dockerfile 克隆我的存储库,然后能够使用 Cassandra、Kafka、Scala、Java 和 SBT 构建它,这样他们就可以编译源代码。不过,我对此有很多问题。

如何组合这些 Dockerfile?我如何简单地制作一个包含这些东西的环境?

原文由 David 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 420
2 个回答

您可以使用 Docker 1.17 中引入的 多阶段构建 功能

看看这个:

 FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]

然后正常构建镜像:

 docker build -t alexellis2/href-counter:latest

来自: https ://docs.docker.com/develop/develop-images/multistage-build/

最终结果是与以前相同的微小生产图像,但复杂性显着降低。您不需要创建任何中间图像,也不需要将任何工件提取到本地系统。

它是如何工作的?第二个 FROM 指令以 alpine:latest 映像为基础开始一个新的构建阶段。 COPY –from=0 行仅将构建的工件从前一个阶段复制到这个新阶段。 Go SDK 和任何中间工件都被留下,不会保存在最终图像中。

原文由 Mohammed Noureldin 发布,翻译遵循 CC BY-SA 4.0 许可协议

您不能合并 dockerfile,因为可能会发生冲突。您要做的是创建一个新的 dockerfile 或构建一个自定义映像。

TL;博士;如果您当前的开发容器包含您需要和工作的所有工具,则将其保存为图像并将其保存到存储库中,并创建一个 dockerfile 以从该存储库中提取该图像。

详细信息:构建自定义镜像比使用公共镜像创建 dockerfile 容易得多,因为您可以将任何 hack 和 mod 存储到镜像中。为此,请使用基本 Linux 映像(或 broadinstitute/scala-baseimage)启动一个空白容器,安装所需的任何工具并配置它们,直到一切正常,然后将其(容器)保存为映像。从这个镜像创建一个新容器并测试你是否可以通过 docker-compose 在它上面构建你的代码(或者你想要做/构建它)。如果它有效,那么您就有一个可以上传到存储库的有效基础图像,以便其他人可以拉取它。

要使用公共映像构建 dockerfile,您需要将所有 hack、mod 和设置放在 dockerfile 本身上。也就是说,您需要将您使用的每个命令行放入一个文本文件中,并将任何黑客、模组和设置减少到命令行中。最后,您的 dockerfile 将自动创建一个图像,您不需要将此图像存储到一个 repo 中,您所需要做的就是将 dockerfile 提供给其他人,他们可以在自己的 docker 上旋转图像。

请注意,一旦您有了一个工作的 dockerfile,您就可以轻松地对其进行调整,因为每次使用该 dockerfile 时它都会创建一个新图像。使用自定义映像,您可能会遇到由于冲突而需要重建映像的问题。例如,您的所有工具都可以与 openjdk 一起使用,直到您安装了一个不起作用的工具。该修复可能涉及卸载 openjdk 并使用 oracle 之一,但是您为已安装的所有工具所做的所有配置都损坏了。

原文由 Hin Fan Chan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题