2017-11-25 205 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