2017-11-25 203 views
0

我的撰写yaml有3个服务 当我使用docker-compose时,我能够成功运行容器。 现在我想将这3个容器构建成单个图像。可能吗? 这里是这不是建议我 撰写,YAML基于Docker撰写单个图像撰写容器

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 
+0

不推荐,也不会正式支持。相反,你可以做的是构建一个定制的Dockker镜像,例如,以'apexits/ubuntu-oracle-jdk8-tomcat9'为基础,你可以安装和配置mysql和elasticsearch服务,而不是混合全面的Docker镜像,造成大噩梦。 –

回答

1

。您需要对每个图像进行逆向工程,并将所需的二进制文件/文件复制到组合图像中。造成这种情况的方法是使用docker multistage build

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 
... 

这种做法是非常招,你需要逆向工程每个图像找出哪些文件/文件夹/配置需要被复制到组合图像......

或者,您可以从其中一个图像开始,然后使用每个图像的标准安装准则安装其他程序。

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

+0

Thnxx您的意见..现在我试图建立的MySQL,tomcat,elasticsearch和另一项服务在Windows单个图像..我无法运行所有这些服务..我得到一个错误,因为在虚拟机初始化期间发生错误 无法为对象堆预留足够的空间......请帮助我解决此问题.. –

+0

您是否按照https://docs.docker.com/engine/admin/multi-service_container/中的步骤操作 – yamenk