如何使用Dockerfile和docker-compose构建项目的镜像?

5
我有一个项目,在本地开发中使用 docker-compose 运行。
作为 gitlab 和部署的组织要求的一部分,该应用程序需要构建成单个 Docker 镜像。
我知道可以通过向项目添加 Dockerfile 来完成此操作。
但是,我想知道如何将通过 docker-compose 运行多个服务的项目与应用程序代码库合并到一个带有 Dockerfile 的单个镜像中以进行部署。谢谢。
编辑:据我所了解,方法是从应用程序代码库构建一个新镜像,然后将其包含在部署环境的 docker-compose.yml 文件中?
编辑 2:对于造成的混淆表示歉意。我对 Docker 还不熟悉,还有一些学习曲线!在这种情况下,似乎可以在 gitlab 注册表中构建应用程序镜像,然后将该镜像包含在 docker-compose 中以进行部署,我会尝试的。

没有看到你的 docker-compose.yml 文件,回答这个问题会非常困难。有些东西是无法直接转换的。从 docker-compose 切换到单个 Dockerfile 可能会增加项目的复杂性。 - larsks
@larsks 谢谢您的回复。我已经在 docker-compose.yml 文件中添加了更多细节。请检查是否有助于将其转换为项目的 Dockerfile。 - David Thomas
1个回答

9

TL;DR

一个单独的Dockerfile通常不能替代使用docker-compose创建的整个容器编排,并不是一个好的选择。

关于将 docker-compose.yml 文件转换为 Dockerfile:

你可以从docker-compose.yml文件中传递一些信息到你的Dockerfile文件(例如要运行的命令),但这并不等同,也不能对所有的docker-compose.yml文件内容进行操作。

你可以使用命令行来替换你的docker-compose.yml文件(因为docker-compose就是用来替代它的)。


但是

请记住,Dockerfilesdocker-compose 有两个完全不同的目的。

  • Dockerfile是用于构建镜像的,以定义构建镜像的步骤。

  • docker-compose是一个工具,用于启动和编排容器以构建您的应用程序(您可以添加一些信息,如构建上下文路径或需要的镜像名称,但不能添加Dockerfile内容本身)。

因此,要求“将docker-compose.yml文件转换为Dockerfile”并不是真正相关的。

这更多地涉及将docker-compose.yml文件转换为一个(或多个)手动启动容器的命令行。

docker-compose的目的就是摆脱这些命令行,使事情变得更简单(它自动化了这个过程)。

一个容器中的多个进程:

来自Docker文档

拥有多个进程是可以的,但为了从Docker中获得最大的好处,请避免一个容器负责您整个应用程序的多个方面。

所以,如果你的入口点允许你启动多个进程,或者如果你使用了一个supervisor,那么你可以这样做,但这可能不是最好的选择。

编辑

由于我也不确定对你来说是否清楚,这里是容器和镜像之间的区别

在使用Docker之前,你真的应该检查并尝试理解这个问题,因为这是非常必要的知识。


谢谢您的回复。是的,我理解docker-compose和Dockerfile有不同的用途。在这种情况下,组织要求将项目压缩为单个镜像以进行gitlab CD部署。因此,要从Dockerfile构建项目映像,我需要将docker-compose文件中的命令转换为Dockerfile语法吗? - David Thomas
好的,谢谢,是的我已经阅读了文档,但我并不确定它是否更清晰。也许我可以找到一种方法只使用docker-compose.yml文件。当项目已经在docker-compose中运行时,我不确定为什么需要Dockerfile,然而目标是使用Dockerfile来_构建整个项目的镜像_以进行部署。 - David Thomas
那就是个问题,我怎么能够从docker-compose服务和应用代码构建项目镜像呢?我正试图弄清楚Dockerfile需要什么。 - David Thomas
谢谢,是的我理解“images”是静态组件,从Dockerfile构建而来,而“containers”更像是镜像的运行实例?但是对于项目的Dockerfile需要什么(以使用在docker-compose文件中定义的服务/容器),我还不是很清楚。 - David Thomas
@DavidThomas 就是这样。 用烹饪比喻来说,图像就是模具,容器则是由此制作出的蛋糕。 你不能将创建图像的步骤直接传递给 docker-compose.yml 文件或编排指令传递给 Dockerfile,因为它们不是为这些目的设计的。 - vmonteco
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接