172 похожих чатов

На сервер склонировал с гитхаба проект(Там же в корне проекта

папка докера, а также лежит ямл файл, папка с докерфайлами, конфигами. Наверное это не очень правильно) В докер-композе поднял контейнеры: приложение, веб-сервер и БД.

Докерфайл приложения, как он работает сейчас:
FROM php:7.4-fpm

# Install php extensions
RUN apt-get update && apt-get install -y zip \
&& docker-php-ext-install pdo_mysql

# Set work directory
WORKDIR /var/www/html/app

# Change user from root to 1000
USER 1000
сервис в yml. файле:
php:
build:
context: .
dockerfile: docker/php/Dockerfile
container_name: php
restart: always
depends_on:
- mysql
networks:
- net
Все хорошо, все работает. Если все это сделать руками. Один-два раза. Я хочу подключить CI/CD. С CI особых вопросов нет. Но как теперь можно организовать постоянное разворачивание в контексте докер сборки? По сути, мне по хуку с гитхаба нужно менять код, который лежит в контейнере приложения. Как это можно/правильно делать? Каким-то образом делать git pull на сервере? Папка с докером тогда будет возвращаться к исходному состоянию и все текущие данные я потеряю, или убрать ее вообще с репозитория?

Другой вариант, как пишут в документации CI клиента - полученный артефакт, как образ приложения, пушить в регистр и потом использовать новый образ уже в деплое. По второй части вообще непонятно - как это делать. Нужно же как минимум в docker-compose.yml изменить версию приложения. А потом рестартовать только этот контейнер? Это может быть полностью автоматизировано? Как тогда при этом получить изначальный образ для приложения? Руками создавать и пушить в докерхаб? Как при этом изначально в образ получить код проекта?

Подскажите пожалуйста алгоритм, как это все вместе должно работать?

8 ответов

35 просмотров

Использовать раннер вида dind, описать стейдж типа pull, который будет пуллить образ с хаба, и делать сборку. В запущенном контейнере, если я не ошибаюсь, такого сделать нельзя.

EN- Автор вопроса
Dan Zadiran
Использовать раннер вида dind, описать стейдж типа...

инициализация начинается с того, что вручную создается образ приложения и отправляется в докерхаб и в дальнейшем докерфайл для приложения не используется? При создании первоначального образа, откуда в образ получить код приложения? Или и первоначальный образ приложения создается в ci/cd клиенте? Когда и как тогда остальные сервисы поднимать в докер композе? Откуда начинается процесс?

EN
инициализация начинается с того, что вручную созда...

Пушишь коммит, CI/CD собирает образ и пушит его в docker registry (например, dockerhub). Затем при запуске контейнера docker его скачивает. Образ можно собрать и запушить в registry вручную

EN- Автор вопроса
Максим Мартынов
Пушишь коммит, CI/CD собирает образ и пушит его в ...

В ручном режиме пробовал новый образ подсовывать в докер композ, вроде все работает. Осталось это все автоматизировать. С созданием нового образа в контексте ci/cd понятно- это область ответственности ci/cd клиента. А с помощью чего можно автоматизировать работу с файлом docker-compose. yml на сервере? Я имею в виду- замену названия образа у сервиса приложения и перезапуск контейнера. Ну и сам образ- должен создаваться новый образ, или пулиться с докерхаба, изменяться и пушиться с новым тэгом? Как автоматизированно связать события появления нового образ(обновления) в докерхабе и заменой названия образа в ямл файле? Какие для этого есть инструменты? Или это также область ответственности ci/cd клиента?

EN
В ручном режиме пробовал новый образ подсовывать ...

вариантов запуска контейнеров миллион - от docker-compose до Kubernetes, от push модели, когда CI/CD сам лезет на нужный сервер и поднимает там контейнер, до pull, когда Flux/ArgoCD/Tekton получает информацию о выходе нового тега и поднимает новый контейнер на его основе. У каждого способа есть своя сфера применения, свои достоинства и недостатки

EN
инициализация начинается с того, что вручную созда...

Докерфайл нужен, потому что ты его в CI/CD пихаешь, там же, если нужно меняешь, а затем пушишь, точно также, как бы ты это делал с локальной машины, только делает это виртуалка в виде раннера гитлаба. Обзываешь это стейджом Dockerize в CI. Не совсем понял, что ты имел в виду словами: «при создании первоначального образа, откуда в образ получить код приложения». Лучше пояснить. Сервисы поднимаются в порядке приоритета, указанного в директиве services: Если у тебя зависимые сервисы, то можно использовать -depends-on: К слову, всю эту информацию можно найти на сайте Докера, чтобы лучше запомнить эту информацию и получить скилл самообразования.

EN- Автор вопроса
Dan Zadiran
Докерфайл нужен, потому что ты его в CI/CD пихаешь...

Почему раннер гитлаба? Я хочу использовать тимсити. Настроил подключение к гитхабу. В сборке все шаги делал через command line раннер. Установил зависимости, прогнал тесты. Разбираюсь, как образ создать. При создании первоначального образа- имел в виду можно - локально в среде разработки сделать образ и запушить в докерхаб?

EN
Почему раннер гитлаба? Я хочу использовать тимсити...

Можно любой раннер, в любой CI, просто, как пример дал. Все равно не понял сути твоего вопроса. Если ты про то, можно ли базовый образ пушить в хаб - да. Ты же его тоже пишешь в Докерфайле, который после сборки можно залить в регистри.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта