【问题标题】:docker commit after docker composedocker compose 之后的 docker commit
【发布时间】:2021-09-09 22:55:49
【问题描述】:

我正在按如下方式运行 docker compose:

docker-compose -f docker-compose.dev.yml up --build -d

docker-compose.dev.yml 的内容是:

version: '3'

services:

  client:
    container_name: client
    build:
      context: frontend
    environment:
      - CADDY_SUBDOMAIN=xxx
      - PRIVATE_IP=xxx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    links:
      - express
    volumes:
      - /home/ec2-user/.caddy:/root/.caddy

  express:
    container_name: express
    build: express
    environment:
      - NODE_ENV=development
    restart: always

然后我想从这些容器创建图像以在测试服务器中使用它们,方法是将它们推送到 aws ECR 并拉入测试服务器,以避免重新创建 docker 的时间。简单地使用 docker commit 是行不通的。

从 docker compose 的输出创建图像的正确方法是什么?

谢谢

【问题讨论】:

  • 一般来说,生成镜像的正确方法是使用 Dockerfile。使用docker commit 保存“实时”更改会导致图像难以复制(没有关于它是如何创建的记录)。
  • "简单地使用 docker commit 没有用。"当你尝试时发生了什么?是否存在错误,或者生成的图像与您的预期不符?
  • @larsks 主要不在网络中,那时看起来并不像北斗七星。当我不确定自己是否走在正确的轨道上时,dint 想把时间浪费在尝试修复小孔上。

标签: docker docker-compose amazon-ecr


【解决方案1】:

您基本上不应该使用docker commit。标准方法是描述如何build your images using a Dockerfile,并将该文件签入源代码管理。您可以将构建的镜像推送到 Docker Hub 之类的注册表中,您可以查看原始源代码并重新构建镜像。

好消息是你基本上已经有了这个设置。您的每个 Compose 服务都有一个 build: 块,其中包含有关如何构建映像的数据。所以就够了

docker-compose build

您将为每个组件获得一个单独的 Docker 映像。

通常,如果您这样做,您还需要将图像推送到某个 Docker 注册表。在 Compose 设置中,您也可以为每个服务指定一个 image:。如果您同时拥有build:image:,则指定用于构建图像的图像名称(否则 Compose 将根据项目名称选择一个)。

version: '3.8'
services:
  client:
    build:
      context: frontend
    image: registry.example.com/project/frontend
    et: cetera
  express:
    build: express
    image: registry.example.com/project/express
    et: cetera

然后你可以让 Compose 构建和推送图像

docker-compose build
docker-compose push

最后一项有用的技术是将 Compose 设置拆分为两个文件。主 docker-compose.yml 文件具有在任何系统上运行容器集所需的设置,并且可以访问容器注册表。单独的docker-compose.override.yml file 将支持开发人员在您拥有源代码副本的情况下使用。如果您使用 Compose 进行部署,只需将主 docker-compose.yml 文件复制到目标系统即可。

# docker-compose.yml
version: '3.8'
services:
  client:
    image: registry.example.com/project/frontend
    ports: [...]
    environment: [...]
    restart: always
    # volumes: [...]
  express:
    image: registry.example.com/project/express
    ports: [...]
    environment: [...]
    restart: always
# docker-compose.override.yml
version: '3.8'
services:
  client:
    build: frontend
    # all other settings come from main docker-compose.yml
  express:
    build: express
    # all other settings come from main docker-compose.yml

【讨论】: