2017-02-03 12 views
0

У меня есть файл сборки Docker в моем проекте Java Maven для его создания. Изображение докера заканчивается примерно на 1 ГБ. Все, что я хочу сделать, это построить артефакт войны и сохранить размер. Вот то, что я до сих пор:Docker build image 1GB или слишком большой

FROM java:8 

#FROM maven:latest 
MAINTAINER Sonam <[email protected]> 

RUN apt-get update 
RUN apt-get install -y maven 

WORKDIR /code 

#Prepare by downloading dependencies 
ADD pom.xml /code/pom.xml 
RUN ["mvn", "dependency:resolve"] 
RUN ["mvn", "verify"] 

#Adding source, compile and package into a fat jar 
ADD src /code/src 

RUN ["mvn", "clean"] 
RUN ["mvn", "install", "-Dmaven.test.skip=true"] 

RUN mkdir webapps 

CMD ["echo"] ["hello"] 

У меня есть блок файл CoreOS, где, когда этот контейнер запускается, я хочу, чтобы скопировать войну в другой файл.

ответ

1

Вы можете увидеть альтернативу «How do I build a Docker image for a Ruby project without build tools?»

  • я использовать изображение, чтобы построить,
  • предаю в результате остановленном контейнер как новое изображение (с объемом в том числе в результате двоичный)
  • Я использую образ выполнения (тот, который содержит только то, что вам нужно запустить), и скопируйте двоичный файл из другого изображения. Я снова передаю полученный контейнер.

Окончательное изображение включает скомпилированную двоичную и исполняющую среду.

В вашем случае убедитесь, что ваш текущий файл Dockerfile объявляет том и создает войну (из компиляции maven).

Затем зафиксируйте полученный контейнер как новое временное изображение «компиляции».
Используйте другой файл Dockerfile, который запускает и копирует войну «из-объема» вашего изображения компиляции.

docker run -u root -it --name=installation.cont --volumes-from compilation.cont --entrypoint "/bin/sh" installation.image -c "cp /avolume/myway /to/my/path" 

В результате остановился контейнер installation.cont может быть совершено как изображение installation.image.

Тогда вы можете написать третий Dockerfile, начиная с этим образом: FROM installation.image (который включает в себя только вашу войну), и добавив, что вам нужно для того, чтобы использовать эту войну. docker commit apache.inst.cont apache.inst

+0

Это выглядит сложным, но я увижу, смогу ли я объединить свои идеи. Спасибо Vonc – Sonam

+1

@Sonam. Но основная идея состоит в том, чтобы построить ваш двоичный файл в одном контейнере и скопировать его по другому контейнеру, который после того, как он был сделан, станет вашим базовым изображением. – VonC