当前位置: 首页 > 知识库问答 >
问题:

Docker-compose:在生产中用预先构建的映像取代基于“构建”的服务?

邵昆琦
2023-03-14

假设我们有以下docker-compose.yml:

version: '3'
services:
  db:
    image: "postgres"
    ports:
     - "5432:5432"
    environment:
     - POSTGRES_PASSWORD=mysecretpassword
  web:
    build: web
    depends_on: [ db ]
    ports:
     - "80:80"

第一个服务db只运行一个容器,其中包含来自Docker Hub的官方postgres映像。

第二个服务web首先在一个名为web文件夹中基于dockerfile构建一个新的映像,然后运行一个包含该映像的容器。

假设我们现在想要部署到生产中。我的理解是,docker-compose.yml现在可以用来“在docker的群模式下定义堆栈”(例如,请参见下面的答案)。但是,对于Web服务的build步骤,Docker的compose file文档声明

在使用(版本3)组合文件以群集模式部署堆栈时,将忽略此选项。docker堆栈命令只接受预生成的图像。

无论如何,在生产机器上构建映像可能不是一个好主意,因为这会留下构建工件(源代码);这应该发生在构建服务器上。

我的问题是,是否有一种推荐的方法可以在生产过程中修改docker-compose.yml,以某种方式用image: 替换build:web

在生产上没有使用成分。总的来说,我的方法有什么问题吗?

共有1个答案

洪研
2023-03-14

docker-compose.yml应该只包含规范的服务定义。

任何特定于构建环境的东西(例如dev vs prod)都应该在一个单独的文件docker-compose.override.yml中声明。每个构建环境都可以有该文件的自己版本。

build:web声明不属于docker-compose.yml,因为它只应该在本地(可能在构建服务器上)运行,而不是在生产中运行。

version: '3'
services:
  db:
    image: "postgres"
    ports:
     - "5432:5432"
    environment:
     - POSTGRES_PASSWORD=mysecretpassword
  web:
    depends_on: [ db ]
    ports:
     - "80:80"

这将是本地开发的默认docker-compose.override.yml:

version: '3'
services:
  web:
    build: web

运行docker-compose up--build-d现在将构建最新的代码更改并在本地启动我们的应用程序。

还可以有另一个版本docker-compose.override.build.yml,目标是构建/CI服务器:

version: '3'
services:
  web:
    build: web
    image: mydockeruser/web
version: '3'
services:
  web:
    image: mydockeruser/web
 类似资料:
  • 目前,我发现谷歌云构建发生在构建docker图像的时候(不像我想象的那样,它会构建我的图像,然后执行我的图像来完成所有的构建)。那是在这篇文章里 谷歌云构建的快速启动 我有一个Dockerfile现在很简单 我有一个单一的下载和提取下载任何工件(zip文件)从最后的单构建运行构建(只有修改的服务器被构建或依赖于上一个CI构建的变化的服务器被构建,就像下游库可能被更改)。第一行只是列出了我需要在一个

  • 然而,我正试图使它在Windows10中工作,但没能做到。Windows 10中的等价物是什么?

  • 我是Docker和Jenkins的新手,我正在尝试创建一个Jenkins管道来构建Docker的形象。我在尝试构建时遇到了问题,并不断收到此错误: /var/jenkins_home/workspace/Docker-Pipeline@tmp/耐用-a11b32f8/脚本。sh:第1行:docker:未找到命令 我已经在虚拟机上安装了ubuntu 我正在做和他完全一样的事情,但总是失败。

  • 我有以下文件夹结构: 这里,我的是: 当我运行时,我希望有两个输出图像,一个用于,一个用于。 我使用(仅与版本2的语法兼容)。

  • 前文提到的Dockerfile 可以让用户管理一个单独的容器,那幺如果我要管理多个容器呢,例如:我需要管理一个Web应用的同时还要加上其后端的数据库服务容器呢?Compose就是这样的一个工具。让我们看下官网对Compose的定义: Compose 是一个用于定义和运行多容器的Docker应用的工具。使用Compose,你可以在一个配置文件(yaml格式)中配置你应用的服务,然后使用一个命令,即可

  • 我试图从docker容器中安装curl,但由于以下错误而失败,我尝试设置代理-No go 尝试的步骤: > 使用Dockerfile构建docker 使用构建参数HTTP_PROXY构建 Docker 构建 docker登录到repo,然后尝试构建镜像-no go 使用 env 代理更新 config.json 文件 - 不行 使用不同的代理 试图刷新windows pc上的DNS docker构