我是新入码头的世界,我正在努力理解码头的概念,家长形象。假设我想在docker上运行django应用程序。我想使用ubuntu和python,我想使用postgresql作为我的数据库后端,我想在gunicorn web服务器上运行django应用程序。我可以为ubuntu、python、postgres和gunicorn创建不同的基本映像,并创建这样的django容器:
FROM ubuntu
FROM python:3.6.3
FROM postgres
FROM gunicorn
...我正在考虑有不同的基础形象,因为如果有一天我想更新这些图像中的一个,我只需要更新基本图像,而不是进入ubuntu并更新它们。
发布于 2019-09-03 05:07:16
不,您不能这样创建您的图像,在您发布的Dockerfile中,唯一作为基图像处理的图像将是最后一个FROM gunicor。您需要的是多阶段构建,但在此之前,我将澄清有关此类Dockerfile的一些概念。
父图像是图像所基于的图像。它引用Dockerfile中FROM指令的内容。Dockerfile中的每个后续声明都会修改此父映像。大多数Dockerfile是从父映像开始的,而不是从基本映像开始的。然而,这些术语有时可以互换使用。
但就您的情况而言,我不建议将所有内容都放在一个Dockerfile中。它将扼杀Containerization.的目的
经验法则
每个集装箱一个过程
每个容器应该只有一个关注点
将应用程序解耦到多个容器中,可以更容易地进行水平扩展和重用容器。例如,web应用程序堆栈可能由三个单独的容器组成,每个容器都有自己独特的映像,用于以解耦的方式管理web应用程序、数据库和内存缓存。
除了数据库之外,您还可以使用多阶段构建。
如果您使用Docker 17.05或更高版本,则可以使用多阶段构建来大幅缩小最终映像的大小,而无需在构建过程中跳过圈来减少中间层的数量或删除中间文件。 只有在最后阶段才能生成图像,大多数情况下,您可以同时受益于构建缓存和最小化图像层。 您的构建阶段可能包含几个层,从更改频率较低的层排序为更改频率较高的层,例如:

通过多阶段构建,Dockerfile可以包含multiple FROM行,每个stage都从一个新的FROM行和一个新的上下文开始。您可以从copy artifacts中提取stage to stage,没有复制的工件将被丢弃。这允许保留最终图像更小的,并且只包括相关的工件。
发布于 2019-09-03 04:57:09
您可以使用同一个Dockerfile中的多个,只要您正在执行多级建造
Dockerfile的一个部分将构建另一个使用的中间映像。
但这通常是用来将用于构建最终程序的父母与执行最终程序所需的父母区分开来的。
发布于 2019-09-03 05:06:08
是可能的吗?是的,技术上多个基本图像(FROM XXXX)可以出现在单个停靠文件中。但这不是为了你想要做的事。它们用于多阶段构建。您可以阅读更多关于它的这里。
问题的答案是,如果您想要实现这种类型的对接映像,您应该使用一个基本映像并使用类似的RUN命令安装其中的其他所有内容。
FROM ubuntu
RUN apt install postgresql # install postgresql
...显然,这并不是那么简单。base映像非常小,您必须安装安装python、postgres和gunicorn命令所需的所有依赖项和工具。例如,如果需要下载python源代码,请使用
RUN wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz wget (很可能)不是在ubuntu映像中预先安装的。你得自己安装。
,我应该这么做吗?,我想你是在反对把应用程序篡改的整个想法。这不是建立一个包含所有服务的巨大的整体映像,而是将服务划分到单独的容器中。(一般来说,每个容器应该有一个服务),然后让这些容器使用码头网络工具相互交谈。也就是说,您应该使用一个用于postgres的容器,一个用于nginx的容器,一个用于gunicorn的容器,分别运行它们并通过network.There连接它们,这是一个很棒的工具,docker-compose,它附带了用于自动化这种多容器设置的对接工具。你真的应该用它。有关它的更多实用示例,请阅读此好文章。
https://stackoverflow.com/questions/57765031
复制相似问题