💪💪💪🏅DEVOPS💪💪💪
Над наверное ставить на Винду на рамдиск для тестов
Pavel
В этой схеме меня смущает то, что если git-репозиторий на 2гб и у нас CI для 10 программистов, каждый делает по 10 коммитов в день, то мы получаем 200гб трафика ежедневно. А еще нужно выкачать внешние зависимости еще на столько же.
Pavel
Как-то все так себе, жиденько.
Pavel
ну можно скриптом, который заупскает билд копировать папку с сорцами (без папки .git) в локальную директорию билда
Можно тут много чего напридумывать. Меня больше интересуют какие-то все таки best practice. Общие решения, которые отработаны на больших проектах, и их можно адапритровать под средние и мелкие.
bazzilic
git clone --depth=1 <url репозитория>
bazzilic
если есть сабмодули, то еще можно добавить --shallow-submodules
Pavel
Ну и проблема та же. Снижаем 200гб трафика до 100, внешние зависимости все также весят 200гб. И получаем вместо 400гб - 300гб.
bazzilic
ну, у нас билды происходят на одноразовых виртуалках, нам все равно выкачивать репозиторий
Pavel
А вы так и делаете? --depth=1 ?
bazzilic
мы не кладем сорцы в виртуалку
bazzilic
тьфу
bazzilic
в контейнер
Pavel
volume?
bazzilic
в виртуалку, где билд - git clone делаем. репы относительно небольшие, у нас типа микромодульный подход
bazzilic
в контейнер сорцы не кладем вообще
bazzilic
т.к. репы небольшие, то целиком клонируем
bazzilic
как разрастутся, будем делать shallow clone
bazzilic
при билде история коммитов до царя гороха особо не важна
Anonymous
ребят есть маленький вопрос не могу нагуглить вот я запускаю django как docker-copose up и у меня появляется в консоли всякие штуки я ее закрываю но как мне обратно мне подключится к этому процессы чтобы посмотреть что в выводе происходить
organizzzm
Если в Dockerfile прописать FROM scratch, COPY build /build. То контейнер не запустится? У меня пишет в консоль - docker: Error response from daemon: No command specified.
organizzzm
У меня в контейнере только набор статических файлов. Для этого тоже нужно ставить ОС?
Pavel
Ну у тебя нет entrypoint, т.е. нет процесса который бы холдил контейнер.
Pavel
Добавь #!/bin/bash while true; do sleep 300 done И сделай его энтрипоинтом.
Pavel
Только.... только вот у тебя баша нет.
organizzzm
))
Pavel
А какой кейс, расскажи плз)
Pavel
Можно же на alpine сделать, 5мб всего)
organizzzm
На alpine нормально отрабатывает
organizzzm
я в конце прописал CMD ["/var/www/“] и теперь ругается что "exec: \"/var/www/\": permission denied"
Pavel
Ты выполняешь папку.
Pavel
Папку нельзя запустить.
organizzzm
А если вместо CMD ENTRYPOINT прописать
organizzzm
та же ошибка получается(
Pavel
Что ты хочешь запустить?
organizzzm
окей. я понял.
organizzzm
да просто контейнер хочу поднять со статик. файлами. Что бы их потом nginx подхватывать мог
Pavel
Не получится у тебя ничего с текущим подходом. Положи файлы туда где лежит nginx.
organizzzm
вот мой докерфайл
organizzzm
FROM node:9.4 as builder RUN curl -o- -L https://yarnpkg.com/install.sh | bash WORKDIR / COPY package.json / COPY src /src COPY public /public RUN yarn install RUN yarn build FROM scratch WORKDIR /var/www/ COPY --from=builder public /var/www/public COPY --from=builder build /var/www/build
Pavel
Причем здесь workdir? Как nginx в соседний контейнер за файлами ходить будет?
Alexander
Пытаюсь подключится к удалённому docker демону. Сеть выдаёт странное: ~ $ ping 10.0.2.15 PING 10.0.2.15 (10.0.2.15) 56(84) bytes of data. 64 bytes from 10.0.2.15: icmp_seq=1 ttl=64 time=0.323 ms 64 bytes from 10.0.2.15: icmp_seq=2 ttl=64 time=0.285 ms 64 bytes from 10.0.2.15: icmp_seq=3 ttl=64 time=1.88 ms ^C --- 10.0.2.15 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1999ms rtt min/avg/max/mdev = 0.285/0.830/1.884/0.745 ms ~ $ telnet -d 10.0.2.15 2375 Trying 10.0.2.15... setsockopt (SO_DEBUG): Permission denied telnet: connect to address 10.0.2.15: No route to host ~ $
Alexander
Как так но роут когда пинг есть?
Pavel
выполни из под рута
Alexander
~ $ sudo su - Last login: Sat Jan 20 23:59:57 MSK 2018 on pts/1 [root@cen7 ~]# telnet -d 10.0.2.15 2375 Trying 10.0.2.15... telnet: connect to address 10.0.2.15: No route to host [root@cen7 ~]# ping -q 10.0.2.15 PING 10.0.2.15 (10.0.2.15) 56(84) bytes of data. ^C --- 10.0.2.15 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4000ms rtt min/avg/max/mdev = 0.262/0.309/0.334/0.032 ms [root@cen7 ~]#
Pavel
Интересно)
Alexander
На удалёном хосте [root@cen7 ~]# firewall-cmd --permanent --zone=public --query-port=2375/tcp no [root@cen7 ~]# firewall-cmd --permanent --zone=public --add-port=2375/tcp success [root@cen7 ~]# firewall-cmd --permanent --zone=public --query-port=2375/tcp yes
Alexander
хостнеймы чот одинаковые, но не должно же влиять
Alexander
Да и не про порт же ошибка
bazzilic
окей. я понял.
тебе для файлов нужен не контейнер, а volume
organizzzm
не. volume не то. Nginx в одном контейнере, фронт в другом
Bloody‏🦊
Ну практически
Pavel
Аааааа. И типа надо чтобы и фронт и nginx могли достучаться до файлов?
Pavel
Ну в общем если мы говорим про решение в рамках одной машины, то можно просто через volume вынести папку на хост машину и ее подключать и к фронту и к nginx. Если надо чтобы это работало на нескольких машинах, то нужно написать свой file storage в котором будут лежать файлы, и nginx с фронтом будут ходить к нему за файлами по сети.
Pavel
Третье решение, вынести файлы в s3. Just FYI
Alexander
Спасибо, а где дока нормальная на firewalld не знаешь? Нихрена не понимаю, как пофиксить.
organizzzm
Попробую иначе объяснить. Фронт содержит много лишних зависимостей. Я в первом FROM я выполняю тесты и собираю билд на прод. Во втором FROM я просто беру этот билд. Он состоит из файла *.js и *.html например. Чтобы контейнер который пойдет на прод был без лишних файлов. И по идее ОС мне ненужна, ибо запускать нечего. Это просто хранилище файлов так сказать. А nginx при запросе файлов должен идти на тот контейнер и забирать нужный файл. Как то так я это представляю
organizzzm
А контейнер с FROM scratch не запускается)
Alexander
ггг, щас перед тем как на телеграм(м?) переключиться (т.е. до прочтения сообщения), подумал примерно об этом же
Pavel
Попробую иначе объяснить. Фронт содержит много лишних зависимостей. Я в первом FROM я выполняю тесты и собираю билд на прод. Во втором FROM я просто беру этот билд. Он состоит из файла *.js и *.html например. Чтобы контейнер который пойдет на прод был без лишних файлов. И по идее ОС мне ненужна, ибо запускать нечего. Это просто хранилище файлов так сказать. А nginx при запросе файлов должен идти на тот контейнер и забирать нужный файл. Как то так я это представляю
Представь что ты смог как-то запустить это контейнер файлами и он живет. И представь, что этот контейнер запустился на отдельной машине, не на той где у тебя nginx. Т.е. nginx у тебя на машине А, а файлы на машине Б. Они общаются по сети. Как nginx будет забирать файлы? Отдельная машина - это не папка, нельзя обратится просто по пути и получить файл. На машине Б должен быть кто-то, кто будет принимать запросы от машины А и отдавать взамен путей файлы. Самое простое - добавить в машину Б еще один nginx. А если у тебя там живет nginx, то у тебя уже не FROM scratch, а FROM nginx:alpine, и все живет хорошо.
organizzzm
Тоесть это нормально если у меня будет общий проксирующий nginx и в контейнере фронта тоже nginx? Или стоит пересмотреть всю архитектуру с корня?
Pavel
Я бы подумал над тем, чтобы объединить эти два nginx, но если это проблематично, то норм.
Pavel
Если у тебя несколько проектов хостится на машине, то может быть еще 3й nginx который маршрутизирует по проектам внутри докера.
Pavel
А если есть еще проекты на хосте вне докера, то будет еще и 4й nginx, который маршрутизирует на хосте - хост/докер.
organizzzm
) Хорошо. Частично разморочили. Спасибо. Буду продолжать сетапить проект)
Roman
Traefik ж есть
a1eXei
а что такого в traefik? а то я один раз поднимал его, пока разбирался с проксированием контейнеров
Pavel
Я использую https://github.com/jwilder/nginx-proxy Но смысл я так понимаю один и тот же.
Roman
Траефик вроде может акме
Roman
А чем рулить перед контейнерами без разницы почти, либо jwilderовским образом, либо траефом
Chebyrash
Друзья, прошу прощения за нубский вопрос. Есть два контейнера оба запущенный через -p хх:хх
Chebyrash
Как сделать чтобы один мог пойти к другому?
Chebyrash
Я правильно понимаю, что нужно указать 172.0.0.1:хх
Chebyrash
Мне просто казалось, что они оба на одной network
Roman
docker inspect <Id>
Roman
По ним обращайся
Roman
Если они в одном нетворке