Многоразовое изображение докера для AngularJS

angularjs json docker environment-variables dockerfile

865 просмотра

2 ответа

12602 Репутация автора

У нас есть приложение AngularJS. Мы написали для него докер-файл, чтобы его можно было использовать в любой системе. Dockerfile - не лучшая практика, и для некоторых это может быть странная сборка (сборка и размещение в одном файле), но она просто создана для локального запуска нашего приложения angularjs на каждом ПК каждого разработчика.

Dockerfile:
FROM nginx:1.10

... Steps to install nodejs-legacy + npm

RUN npm install -g gulp
RUN npm install
RUN gulp build  

.. steps to move dist folder

Мы создаем наш имидж с помощью docker build -t myapp:latest . Каждый разработчик может запускать наше приложение сdocker run -d -p 80:80 myapp:latest

Но сейчас мы разрабатываем другие бэкэнды. Итак, у нас есть бэкэнд в DEV, бэкэнд в UAT, ... Итак, есть разные URL, которые нам нужно использовать в/config/xx.json

{
  ...
  "service_base": "https://backend.test.xxx/",
  ...
}

Мы не хотим каждый раз менять этот URL, перестраивать изображение и запускать его. Мы также не хотим объявлять некоторые URL-адреса (dev, uat, prod, ..), которые можно использовать там. Мы хотим выполнить наш gulp buildпроцесс с переменной среды вместо жестко закодированного URL.

Итак, мы можем запустить наш контейнер следующим образом:

docker run -d -p 80:80 --env URL=https://mybackendurl.com app:latest

Есть ли кто-то, кто имеет опыт решения подобных проблем? Таким образом, нам понадобится переменная env в нашем json и ее сборка, а затем добавим URL, если это возможно.

Автор: lvthillo Источник Размещён: 18.07.2016 11:57

Ответы (2)


1 плюс

875 Репутация автора

РЕДАКТИРОВАТЬ: лучше выбрать использование аргументов сборки

Вместо передачи URL-адреса в команде docker run вы можете использовать аргументы сборки docker. Лучше иметь команды, связанные со сборкой, которые будут выполняться во время сборки Docker, чем запуск Docker.

В вашем Dockerfile,

ARG URL 

А потом беги

docker build --build-arg URL=<my-url> .

Посмотрите этот вопрос stackoverflow для деталей

Автор: atv Размещён: 18.07.2016 12:54

0 плюса

12602 Репутация автора

Это было мое «решение». Я знаю, что это не лучший подход к докеру, но только для наших разработчиков это очень помогло.

Мой dockerfile выглядит так:

FROM nginx:1.10

RUN apt-get update && \
 apt-get install -y curl

RUN sed -i "s/httpredir.debian.org/`curl -s -D - http://httpredir.debian.org/demo/debian/ | awk '/^Link:/ { print $2 }' | sed -e 's@<http://\(.*\)/debian/>;@\1@g'`/" /etc/apt/sources.list

RUN \
  apt-get clean && \
  apt-get update && \
  apt-get install -y nodejs-legacy && \
  apt-get install -y npm

WORKDIR /home/app
COPY . /home/app

RUN npm install -g gulp
RUN npm install

COPY start.sh /
CMD ["./start.sh"]

Поэтому после полного включения приложения + npm в мой nginx я запускаю свой контейнер с помощью скрипта start.sh.

Содержание start.sh:

#!/bin/bash
sed -i 's@my-url@'"$DATA_ACCESS_URL"'@' configs/config.json
gulp build
rm -r /usr/share/nginx/html/
//cp right folders which are created by gulp build to /usr/share/nginx/html
...
//start nginx container
/usr/sbin/nginx -g "daemon off;"

Поэтому сборка произойдет, когда мой контейнер запустится. Конечно, это не лучший способ, но все это для нужд разработчиков. Иметь легкий местный интерфейс.

Команда sedвыполнит замену файла конфигурации, который содержит что-то вроде:

{
  "service_base": "my-url",
}

Таким образом, my-url будет заменен на my содержимое моей переменной окружения, которое я определю в моей docker runкоманде.

Чем я умею выступать.

docker run -d -p 80:80 -e DATA_ACCESS_URL=https://mybackendurl.com app:latest

И каждый разработчик может использовать веб-интерфейс локально и связываться со своим собственным URL-адресом бэкэнда.

Автор: lvthillo Размещён: 02.08.2016 01:28
Вопросы из категории :
32x32