2016-09-29 1 views
2

У меня есть процесс сборки, который преобразует машинопись в JavaScript, к minifies и сцепляются CSS файлы и т.д.Docker контейнер с выходом сборки и без источника

Я хотел бы, чтобы поместить эти файлы в контейнер Nginx докер, но дон Не хотите, чтобы исходный источник javascript/css был включен, а также инструменты, которые я использую для их создания. Есть ли хороший способ сделать это, или мне нужно запустить сборку вне докеров (или в отдельно определенном контейнере), затем КОПИРОВАТЬ соответствующие файлы?

This page говорит о выполнении чего-либо подобного в ручном режиме, но не объясняет, как автоматизировать процесс, например. с докер-сочинением или чем-то.

+0

пример с использованием 'dobi' (отказ от ответственности, я являюсь автором этого инструмента), чтобы автоматизировать этот процесс: https://github.com/dnephin/dobi/tree/master/examples/minimal- докер-изображение. 'dobi' был разработан для таких задач. Compose на самом деле не предназначен для таких задач построения проекта. – dnephin

ответ

1

Два распространенных варианта:

  • Как уже упоминалось, вы можете построить снаружи и скопировать скомпилированный результат в контейнер.

  • Вы объединяете свой процесс загрузки, сборки и очистки в одну команду RUN. Это общая рекомендация по минимизации размера каждого слоя.

Пример Dockerfile второй вариант будет выглядеть так:

FROM mybase:latest 
RUN apt-get update && apt-get install tools \ 
    && git clone https://github.com/myproj \ 
    && cd myproj \ 
    && make \ 
    && make install 
    && cd .. \ 
    && apt-get rm tools && apt-get clean \ 
    && rm -rf myproj 

линии будет немного сложнее, но это суть.

+0

Вариант 2 не представляется жизнеспособным. Загрузка, сборка, очистка - это такие вещи, как установка NodeJS, установка множества инструментов и зависимостей, а затем удаление их снова. – rjmunro

+0

Если вы не хотите их на изображении, но хотите, чтобы ваше изображение было полностью автономным (просто запустите 'docker build' в любом месте), это единственное решение для вашего запроса. Вариант 1 выполняется довольно часто для статически связанных двоичных файлов, ваша сборка просто включает 2 части, снаружи и внутри Docker. Отдельной сборкой может быть контейнер-докер, который выводит результаты через хост-хост при запуске, а затем вы импортируете этот результат в свое окончательное изображение с опцией 1. – BMitch

-1

Создать Docker файл для запуска процесса сборки, а затем запустить код очистки

Пример:

FROM node:latest 

# Provides cached layer for node_modules 
ADD package.json /tmp/package.json 

RUN cd /tmp && npm install 
RUN mkdir -p /dist && cp -a /tmp/node_modules /dist/ 
RUN cp /tmp/package.json /dist 

ADD . /tmp 

RUN cd /tmp && npm run build 
RUN mkdir -p /dist && cp -a /tmp/. /dist 

#run some clean up code here 
RUN npm run cleanup 

# Define working directory 
WORKDIR /dist  

# Expose port 
EXPOSE 4000 

# Run app 
CMD ["npm", "run", "start"] 

В файле создания сообщения Docker

web: 
    build: ../project_path 
    environment: 
     - NODE_ENV=production 
    restart: always 
    ports: 
    - "4000" 
+2

Выполняя это как отдельные команды RUN, вы создаете слои со всей сборкой инструменты включены, а затем удаляют их в следующих слоях. В результате изображение намного больше и занимает больше времени для отправки по сети, даже если файлы больше не существуют. – BMitch

3
  1. Создание грузчиком изображений с все необходимые инструменты для создания кода также могут клонировать код и строить его. После сборки он должен скопировать в объем докеров, например, имя тома - /opt/webapp.
  2. Запуск сборки докер контейнер, используя строить изображение в шаге 1

    docker run -d -P --name BuildContainer -v /opt/webapp:/opt/webapp build_image_name 
    
  3. Launch nginx Docker контейнер, который будет использовать общий объем сборки грузчиком, в котором код сборки находится.

    docker run -d -P --name Appserver -v /opt/webapp:/usr/local/nginx/html nginx_image_name 
    
  4. После создания и доставки кода сборки на Сервер приложений. вы можете удалить BuildContainer, потому что этого больше не требуется.

Преимущество вышеуказанных шагов:

  1. код сборки будет на хост-машине, так что если один докер из строя или остановки, то ваш код сборки будет безопасным в хост-машине, и вы можете запустить новый используя этот код сборки.
  2. если вы создаете изображение докеров для создания кода, то каждый раз, когда вам не нужно устанавливать необходимый инструмент во время запуска докера.
  3. вы также можете создать свой код на главной машине, но если вы хотите, чтобы ваш код должен быть построен в новой среде каждый раз, тогда это будет хорошо. или если вы используете тот же хост-машину для создания/компиляции кода каждый раз, то некоторые старые исходный код может создать проблемы или GIT ошибку клонирования и т.д.

EDIT:

вы можете добавить :ro (только чтение) к объему, с помощью которого один контейнер не будет влиять на другой. вы можете узнать больше о объеме докеров Here. Спасибо @BMitch за предложение.

+0

Интересный дизайн. Если вы это сделаете, подумайте о том, чтобы установить только чтение томов (добавьте ': ro' в mount тома), чтобы один запущенный контейнер не мог воздействовать на другой. – BMitch

+1

Вы можете сделать что-то очень похожее на это без использования тома для второго изображения («nginx» в этом примере). Таким образом, ваши скомпилированные артефакты включаются в целевой образ и могут быть распределены вместе с ним. https://github.com/dnephin/dobi/tree/master/examples/minimal-docker-image - пример того, как это сделать с помощью 'dobi', который является инструментом, созданным специально для такого рода вещей. – dnephin

+0

@dnephin Не могли бы вы добавить отдельный ответ об этом.Мы хотим, чтобы продукты сборки содержались в изображении, чтобы он был более автономным. Я продолжаю говорить людям «взглянуть на второй комментарий в этом ответе» вместо «взглянуть на этот ответ». – rjmunro

0

Как @dnephin предложил в своих комментариях по этому вопросу и на ответ @ pl_rock, в стандартные инструменты Докер не предназначены, чтобы сделать это, но вы можете использовать сторонний инструмент, как один из следующих способов:

  • dobi (48 звезды GitHub)
  • packer (6210 GitHub звезды)
  • rocker (759 звезды GitHub)
  • conveyor (152 звезды GitHub)

(GitHub звезды исправить, когда я написал ответ)

Мы пошли с Доби, как это было первым, кого мы слышали (из-за этого вопроса), но, похоже, упаковщик является наиболее популярным.

Смежные вопросы