Dmitry
Dmitry
опиши путь от и до. интересно увидеть
Alexey
ну, ангуляру нужен статический сервер для раздачи бандлов, ну и проксирование настроить внутри nginx. В компании где я работаю все микросервисы, сервисы и вебприложения работают внутри докер-контейнеров. И вероятно, это удобно для разворачивания приложений, если это так активно юзается
Dmitry
статический сервер- это что?
Alexey
да, именно
и в зависимости от того какая это сборка нужно менять сборку приложения ( это про ангуляр) и прокси внутри nginx
Dmitry
сделай контейнер для билдов: node+angular+..., в него монтируй билд директорию. вторым шагом добавляй dist в контейнер на базе nginx
Dmitry
в первый можешь еще добавить nginx если хочешь, и юзать его в dev
Dmitry
ты имеешь в виду сервер статики?
akulik512
если юзать на одной тачке докер (+ docker compose) и кубернейтес, не будет ли весь этот зверинец конфликтовать?
Dmitry
и зачем проксить через nginx если ты можешь просто сервить через nginx
Alexey
да, наверное, это называется сервер статики)
Alexey
сервить через nginx? это как, чего?
Dmitry
сервить через nginx? это как, чего?
ну, запихнул бандл в docker image, в котором есть nginx, и наружу смотрит порт 8080 от nginx, на котором только твоя статика. nginx быстрее node
Alexey
А запросы к апи проксировать на отдельном node-серваке?
Dmitry
Dmitry
но вообще, имхо проще всего на s3 засунуть)
George
Всем привет, подскажите, пожалуйста, как правильно организовать билд и деплой ангуляр-приложения с докером. В простейшем случае - 2 версии приложения - dev и prod. Различаются режимами сборки и обращаются к различным серверам через прокси в nginx, ну и выкатываться будут соответственно на различных серверах. Просто я у себя создал 3 Dockerfile:
- Dockerfile.local
- Dockerfile.dev
- Dockerfile.prod
В них различается режим билда приложения на уровне ангуляра (dev и prod сборки), и подсовываются различные конфиги для nginx (в них различаются прокси). Из консоли я могу вызывать команду docker build -t webapp-wms . --file='Dockerfile.dev' и тогда соберется нужный образ. И я думал, что в npm-скрипт можно запихнуть эту команду, вроде:
"build-dev-image": "docker build -t webapp-wms-dev . --file='Dockerfile.dev'" , но нет, при вызове npm-скрипта вываливается следующая ошибка unable to prepare context:
unable to evaluate symlinks in Dockerfile path: GetFileAttributesEx C:\Users\koolikov.av\Documents\projects\webapp-WMS\'Dockerfile.dev': The system cannot find the file specified.
И я могу билдить образ через npm-скрипт, но только если буду удалять расширение на нужном докерфайле .dev, .prod или .local, а это уже сильный колхоз. А хотелось бы просто, запускать билд нужного образа одной командой, которая включала бы в себя :
- удаление старого образа
- билд нового образа (dev, prod, local)
- выставление тэга этому образу для гитлаба
- пуш образа с проставленным тэгом в гитлаб
В общем, если кому не сложно, подскажите, пожалуйста, с помощью какого инструментария это все проворачивается и как вообще процесс должен быть организован? потому что мой вариант пока явный колхоз
я не понял зачем три докерфайла
George
в теории можно было одним обойтись
George
во-первых - мультистейдж
во-вторых - можно ARG передавать переменные внутрь контейнера на стадии сборки и в зависимости от этого что-то делать
George
например, выбирать команду для сборки
Dmitry
George
ну, ты можешь в докер слое его держать
George
типа
George
FROM node as cache
blablabla
build cache
FROM alpine as release
COPY --from=cache bababla node_modules
George
но проблема в том, что кэш ноды тогда легко просрать
Maxim
да, жать там, или в cdn отдавать / подменять
Мы реализовали возможность через get параметры передавать необходимые размеры, фильтры, конвертацию, и много чего еще, для изменения картинки, если интересно могу скинуть ссылку на сервис который мы прикрутили к проекту, нам нельзя было использовать сторонние сервисы для работы с нашей статикой, но взять сторонний сервис и сделать частью нашего приложения это всегда пожалуйста, поэтому было решено поселить его в нашем зоопарке, есть не просит, в быту неприхотлив, живет в отдельной клетке
Dmitry
Dmitry
билдить кеш отдельно?
George
George
docker build —target=cache
Dmitry
ну ок, как кеш передать в другой билд?
Dmitry
если раннер на другом сервере, итд
Dmitry
или подразумевается что делаем билд на одном и том же сервере?
Dmitry
и как тогда он понимает наличие кеша когда мы запускаем docker build —target=cache?
Dmitry
там же npm install в одном слое
Eugene
собираю swarm, оказалось, что в контуре overlay полноценно не работает, но связь между кортейнерами и самими серверами работает нормально. собираюсь передать в контейнер информацию об адресах серверов сервиса (в виде переменной, например) и заставить сервис ходить на адреса серверов. хотелось бы, чтобы адреса вычислялись в момент запуска компоуза, как такое провернуть? не слишком завернул, понятно о чём речь?
Dmitry
по идее можно сделать билд кеш имиджа, и в нем же билдить кеш. то есть на момент запуска docker build в from имидже уже будет старый кеш
Vladimir
Всем привет. Есть следующая задача - написать интеграционный тест изолированный для pcap сниффера. Т.е. мне нужно в одном контейнере иметь сетевой интерфейс в promiscuous mode и из другого контейнера туда направить сетевые пакеты (dns запрос). Может кто-то подсказать, в каком направлении копать и вообще возможно ли это?
Спасибо.
Alexey
во-первых - мультистейдж
во-вторых - можно ARG передавать переменные внутрь контейнера на стадии сборки и в зависимости от этого что-то делать
я в докере вообще не разбираюсь - я фронтенд, и я думал, что в докерфайле нельзя исполнять какие-то условия. Т.е по уму, конечно было бы прописать скрипт 'build-dev-image': docker build -t webapp-wms-dev . ARG MODE=DEV, и в зависимости от него в инструкции Dockerfile сделать нужные манипуляции.
Что-то вроде:
FROM node:8-alpine as buildContainer
COPY . /app
WORKDIR /app
RUN npm install
IF (MODE == 'LOCAL' || MODE == 'DEV') {
RUN npm run build
} ELSE {
RUN npm run build
}
FROM nginx:alpine
COPY --from=buildContainer /app/dist/webapp-WMS /app
IF (MODE == 'LOCAL') {
COPY --from=buildContainer /app/deploy-configs/local/nginx.conf /etc/nginx/nginx.conf
}
IF (MODE == 'DEV') {
COPY --from=buildContainer /app/deploy-configs/dev/nginx.conf /etc/nginx/nginx.conf
}
IF (MODE == 'PROD') {
COPY --from=buildContainer /app/deploy-configs/prod/nginx.conf /etc/nginx/nginx.conf
}
COPY --from=buildContainer /app/mime.types /etc/nginx/mime.types
COPY --from=buildContainer /app/gzip.conf /etc/nginx/gzip.conf
EXPOSE 9000/tcp
George
George
Alexey
если условные конструкции в dockerfile возможны, то это решит все проблемы
George
George
смотри
George
1. итерация - делаешь билд
George
получаешь образ node-cache:latest
George
2. а потом его же используешь в качестве FROM: node-cache:latest as cache
George
херота в том, что если образа изначально нет - ты сосешь лапу
George
George
Dmitry
Dmitry
просто изначально мультистейдж это не ответ для node_modules, .npm
George
FROM ololo
ARG TYPE
ENV TYPE=$TYPE
COPY ./my_build.sh my_build.sh
RUN ./my_build.sh
George
и всю переменную часть (в зависимости от TYPE) засунуть в my_build.sh
George
т.е. у тебя выбор ветки будет именно в my_build.sh
George
в принципе Флант к чему-то подобному пришел со своей утилитой dapp
George
количество базовых примитивов весьма сильно ограничено
Alexey
RUN if [ "$argname" = "false" ] ; then echo 'false'; else echo 'true'; fi нашел такой пример, любая условная конструкция начинается с RUN? и еще и заканчивается каким-то fi
Alexey
спасибо, ребят, был убежден, что в докере нет условных конструкций никаких, от этого и подзакипел
Mentat
Dmitry
я бы все равно сделал dev/build контейнер и еще один в качестве деплоя
George
George
George
Roman
Привет, у меня есть бинарник хотел его в контейнер запихать так вот выглядит докер файл:
FROM alpine
ADD test /usr/bin/
ENTRYPOINT /usr/bin/test
Собираю
docker build -t test .
Запускаю:
docker run test
Вижу:
/bin/sh: /usr/bin/test: not found
Что я не так делаю?
George
1. не используй ADD
George
2. используй COPY
George
3. у тебя chmod +x сделан?
Roman
+
George
George
потом отрефакторишь
George
Roman