基于Docker Compose容器构建单个镜像

11

我的compose-yaml有3个服务。当我使用docker-compose up时,可以成功运行容器。 现在我想将这3个容器构建成单个镜像。这可能吗? 这是我的compose-yaml

version: '2'

services:
  tomcat:
    container_name: tomcatcomposejdk
    build: .
    image: 'apexits/ubuntu-oracle-jdk8-tomcat9'
    ports:
      - "8787:8080"
      - "5003:5003"
    networks:
      b:
        ipv4_address: 10.5.0.6
    expose:
       - "8787"
       - "5003"

  mysql:
    container_name: mysqlcompose
    build: .
    image: 'mysql:5.6.36'
    ports:
      - "3306:3306"
    expose:
      - "3306"  
    networks:
      b:
        ipv4_address: 10.5.0.7
    environment:
      MYSQL_DATABASE: "bird251"
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    volumes:
      - ./BIRD251.sql:/tmp/BIRD251.sql
      - ./import.sh:/tmp/import.sh

  elasticsearch:
    container_name: escompose
    build: .
    image: 'elasticsearch:2.3.4'
    ports:
      - "9200:9200"
      - "9300:9300"
    expose:
      - "9200"
      - "9300"
    networks:
      b:
        ipv4_address: 10.5.0.8

networks:
  b:
    driver: bridge
    ipam:
     config:
       - subnet: 10.5.0.0/16
         gateway: 10.5.0.1

1
不建议使用,也不会得到官方支持。相反,您可以构建一个自定义的Docker镜像,例如以'apexits/ubuntu-oracle-jdk8-tomcat9'为基础,并安装和配置mysql和elasticsearch服务,而不是混合使用功能齐全的Docker镜像,这将始终导致大问题。 - Vane Trajkov
只是一个想法。怎么样创建一个能自行运行 docker-compose up 的容器呢? - undefined
1个回答

6

这种做法是不推荐的。你需要逆向工程每个镜像,并将所需的二进制/文件复制到合并的镜像中。可以通过使用docker多阶段构建来实现:

FROM apexits/ubuntu-oracle-jdk8-tomcat9 as tomcat

FROM mysql:5.6.36 as mysql

FROM elasticsearch:2.3.4
COPY --from=tomcat /.../tomcat-installtion .../tomcat-installation
COPY --from=mysql /.../mysql-installtion .../mysql-installation
...

这种方法非常棘手,需要逆向工程每个图像,以确定需要复制到组合图像中的哪些文件/文件夹/配置...

另一种方法是从其中一个图像开始,并按照每个程序的标准安装指南进行安装。

即使您成功了,也需要在同一个容器中启动多个进程,这是不推荐的,会引入许多复杂性。


2
谢谢您的评论。现在我尝试在Windows单个镜像上构建MySQL、Tomcat、Elasticsearch和另一个服务,但是我无法运行所有这些服务。我遇到了一个错误,即“VM初始化期间发生错误,无法为对象堆保留足够的空间”。请帮助我解决这个问题。 - Sunil Sunny
你有按照 https://docs.docker.com/engine/admin/multi-service_container/ 中的步骤进行操作吗? - yamenk
但是如果Docker Compose使用像Postgres这样的服务呢? - undefined

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