Compare commits
10
Commits
e2ddb3348a
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a2e9bfdd7f
|
||
|
|
39ca4a1a81
|
||
|
|
03ff399a82 | ||
|
|
2bdb9fde2e | ||
|
|
f7312738ef | ||
|
|
f9c92cccff | ||
|
|
b41f3e6606 | ||
|
|
97be430cae | ||
|
|
e12dac7d6d | ||
|
|
8eecd7d41e |
@@ -1 +1,2 @@
|
||||
.idea
|
||||
/.env
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
image: hub.realmanual.ru/images/docker
|
||||
variables:
|
||||
DOCKER_BASEIMAGE: ubuntu:20.04
|
||||
DOCKER_MAINTAINER: vasyakrg@gmail.com
|
||||
DOCKER_IMAGE_NAME: backup
|
||||
BUILD_SCRIPT: ci/build-image/build.sh
|
||||
GIT_SUBMODULE_STRATEGY: none
|
||||
|
||||
build:
|
||||
script:
|
||||
- git submodule sync
|
||||
- git submodule update --init --remote --force
|
||||
- export VERSION=$(cat VERSION)
|
||||
- export DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME}
|
||||
- export DOCKER_IMAGE_TAG=$VERSION
|
||||
- chmod +x "${BUILD_SCRIPT}" && "./${BUILD_SCRIPT}"
|
||||
+31
-4
@@ -4,10 +4,37 @@ FROM ${DOCKER_BASEIMAGE}
|
||||
ARG DOCKER_MAINTAINER
|
||||
LABEL maintainer="${DOCKER_MAINTAINER}"
|
||||
|
||||
COPY assets/build /build
|
||||
WORKDIR /build
|
||||
RUN chmod +x *.sh && \
|
||||
./install.sh
|
||||
RUN set -e && DEBIAN_FRONTEND=noninteractive && \
|
||||
apt-get update && \
|
||||
apt-get install -y gnupg2 wget iputils-ping curl nano ca-certificates apt-transport-https lsb-release
|
||||
|
||||
RUN echo -e "\n====> Install PGSQL + Mysql" && \
|
||||
rm -f /etc/apt/sources.list.d/pgdg.list && \
|
||||
mkdir -p /usr/share/postgresql-common/pgdg && \
|
||||
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc && \
|
||||
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list && \
|
||||
apt update && \
|
||||
apt-cache search postgresql-client-* && \
|
||||
apt install -y postgresql-client-12 postgresql-client-14 postgresql-client-16 postgresql-client-18 mysql-client
|
||||
|
||||
RUN echo -e "\n====> Install Mongo" && \
|
||||
MONGO_VER=8.0 && \
|
||||
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor && \
|
||||
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-8.0.list && \
|
||||
apt update && \
|
||||
apt install mongodb-database-tools -y
|
||||
|
||||
RUN echo -e "\n====> Install Mo" && \
|
||||
curl -sSL https://git.io/get-mo -o mo && \
|
||||
chmod +x mo && \
|
||||
mv mo /usr/local/bin/
|
||||
|
||||
RUN echo -e "\n====> Install S3" && \
|
||||
apt install rclone
|
||||
|
||||
RUN echo -e "\n====> Post install tasks" && \
|
||||
mkdir -p /srv/backup && \
|
||||
apt clean
|
||||
|
||||
COPY assets/ /
|
||||
WORKDIR /usr/local/sbin
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
- DBTABLE - таблица (если не используется, как например в монге, ставим "1")
|
||||
- STORAGE_HOST - можно указать свое s3 хранилище вида `s3.domain.com` либо амазоновское
|
||||
- STORAGE_REGION - по умолчанию: us-west
|
||||
- STORAGE_CLASS - STANDARD_IA (холодное) или STANDARD_IA (обычное)
|
||||
- STORAGE_PATH - путь, куда складывать архив вида `<bucket/folder>`
|
||||
- ACCOUNT_ID - логин в хранилище
|
||||
- APPLICATION_KEY - пароль в хранилище
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
apt-get update && \
|
||||
apt-get install -y gnupg2 wget iputils-ping curl nano ca-certificates apt-transport-https lsb-release && \
|
||||
|
||||
echo deb http://archive.ubuntu.com/ubuntu $(lsb_release -cs) main restricted universe multiverse > /etc/apt/sources.list && \
|
||||
echo deb http://archive.ubuntu.com/ubuntu $(lsb_release -cs)-updates main restricted universe multiverse >> /etc/apt/sources.list && \
|
||||
echo deb http://archive.ubuntu.com/ubuntu $(lsb_release -cs)-security main restricted universe multiverse >> /etc/apt/sources.list && \
|
||||
|
||||
# psql
|
||||
echo -e "\n====> Install PGSQL + Mysql"
|
||||
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | tee /usr/share/keyrings/postgresql.gpg > /dev/null && \
|
||||
echo deb [arch=amd64 signed-by=/usr/share/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main | tee -a /etc/apt/sources.list.d/postgresql.list && \
|
||||
apt-get update && \
|
||||
apt-cache search postgresql-client-* && \
|
||||
apt-get install -y postgresql-client-10 postgresql-client-12 postgresql-client-14 mysql-client
|
||||
|
||||
|
||||
# mongo
|
||||
echo -e "\n====> Install Mongo"
|
||||
MONGO_VER=4.4
|
||||
|
||||
wget -qO - https://www.mongodb.org/static/pgp/server-${MONGO_VER}.asc | gpg --dearmor | tee /usr/share/keyrings/mongodb.gpg > /dev/null && \
|
||||
echo deb [arch=amd64 signed-by=/usr/share/keyrings/mongodb.gpg] https://repo.mongodb.org/apt/ubuntu $(lsb_release -cs)/mongodb-org/${MONGO_VER} multiverse | tee -a /etc/apt/sources.list.d/mongodb-org-${MONGO_VER}.list && \
|
||||
apt-get update
|
||||
apt-get install mongodb-org-tools -y
|
||||
|
||||
# mo
|
||||
echo -e "\n====> Install Mo"
|
||||
curl -sSL https://git.io/get-mo -o mo
|
||||
chmod +x mo
|
||||
mv mo /usr/local/bin/
|
||||
|
||||
# s3
|
||||
echo -e "\n====> Install S3"
|
||||
apt-get install rclone
|
||||
|
||||
|
||||
# Post install tasks
|
||||
echo -e "\n====> Post install tasks"
|
||||
mkdir -p /srv/backup
|
||||
find /etc/cron.* -type f ! -name .placeholder -delete
|
||||
apt-get clean
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
source lib/lib.sh
|
||||
|
||||
ENVS=(PROJECT_NAME DBTYPE DBHOST DBUSER DBPASS DBTABLE STORAGE_HOST STORAGE_REGION STORAGE_PATH ACCOUNT_ID APPLICATION_KEY)
|
||||
ENVS=(PROJECT_NAME DBTYPE DBHOST DBUSER DBPASS DBTABLE STORAGE_HOST STORAGE_PATH ACCOUNT_ID APPLICATION_KEY)
|
||||
|
||||
for ENV in "${ENVS[@]}"; do
|
||||
if [[ -z "${!ENV+x}" ]]; then
|
||||
@@ -35,17 +35,16 @@ case $DBTYPE in
|
||||
;;
|
||||
esac
|
||||
|
||||
# case $STORAGE_TYPE in
|
||||
# s3)
|
||||
# log "Storage type is <s3>"
|
||||
# source storage/s3.sh
|
||||
# ;;
|
||||
# *)
|
||||
# log_error "Unknown storage, known <s3>"
|
||||
# exit 1
|
||||
# ;;
|
||||
# esac
|
||||
STORAGE_TYPE=s3
|
||||
case $STORAGE_TYPE in
|
||||
s3)
|
||||
log "Storage type is <s3>"
|
||||
source storage/s3.sh
|
||||
;;
|
||||
*)
|
||||
log_error "Unknown storage, known <s3>"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
TIME=`date +%Y-%m-%d-%H-%M`
|
||||
ARCHIVE="/srv/backup/""$PROJECT_NAME"_$TIME".$EXT_DB"
|
||||
@@ -55,8 +54,8 @@ db_backup
|
||||
|
||||
log "Copy $ARCHIVE to ${STORAGE_TYPE}"
|
||||
storage_upload
|
||||
rm $ARCHIVE
|
||||
|
||||
log "Completed"
|
||||
|
||||
rm $ARCHIVE
|
||||
|
||||
exit 0
|
||||
|
||||
@@ -14,6 +14,8 @@ password=${DBPASS}
|
||||
[mysqldump]
|
||||
user=${DBUSER}
|
||||
password=${DBPASS}
|
||||
|
||||
column-statistics=0
|
||||
EOF
|
||||
|
||||
chmod 600 ~/.my.cnf
|
||||
|
||||
@@ -3,3 +3,4 @@ S3_HOST_BASE=s3.amegaserver.com
|
||||
S3_REGION=ru-nsk
|
||||
S3_ACCOUNT_ID=
|
||||
S3_APPLICATION_KEY=
|
||||
S3_STORAGE_CLASS=
|
||||
@@ -1,9 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
S3_HOST_BASE=${STORAGE_HOST:-s3.amazonaws.com}
|
||||
S3_REGION=${S3_REGION:-us-west}
|
||||
S3_REGION=${STORAGE_REGION:-''}
|
||||
S3_REMOTE_DIR=${STORAGE_PATH#*/}
|
||||
S3_BUCKET=${STORAGE_PATH%%/*}
|
||||
S3_STORAGE_CLASS=${STORAGE_CLASS:-"STANDARD_IA"}
|
||||
|
||||
# Добавляем в конце '/'
|
||||
if [[ -n "${S3_REMOTE_DIR}" ]] && [[ ${S3_REMOTE_DIR} != */ ]]; then S3_REMOTE_DIR="${S3_REMOTE_DIR}/"; fi
|
||||
@@ -21,17 +22,19 @@ if [[ -n "${DEBUG}" ]]; then
|
||||
fi
|
||||
|
||||
storage_login() {
|
||||
config=/root/.config/rclone/rclone.config
|
||||
local config=/root/.config/rclone/rclone.conf
|
||||
|
||||
[ -f $config ] && rm $config
|
||||
[ -f ${config} ] && rm ${config}
|
||||
|
||||
echo S3_BUCKET=${S3_BUCKET} > .env
|
||||
echo S3_REGION=${S3_REGION} >> .env
|
||||
echo S3_HOST_BASE=${S3_HOST_BASE} >> .env
|
||||
echo S3_ACCOUNT_ID=${ACCOUNT_ID} >> .env
|
||||
echo S3_APPLICATION_KEY=${APPLICATION_KEY} >> .env
|
||||
echo S3_STORAGE_CLASS=${S3_STORAGE_CLASS} >> .env
|
||||
|
||||
mo -s=.env -u /usr/local/sbin/storage/s3.template > $config
|
||||
mkdir -p /root/.config/rclone
|
||||
mo -s=.env -u /usr/local/sbin/storage/s3.template > ${config}
|
||||
|
||||
log "Setup to S3 by ${S3_ACCOUNT_ID} to ${S3_HOST_BASE}" && \
|
||||
export S3_CONNECTION=true
|
||||
@@ -43,6 +46,6 @@ storage_upload() {
|
||||
[ -z ${S3_CONNECTION} ] && storage_login
|
||||
|
||||
log "Upload \"${ARCHIVE}\" \n\t as \"${S3_ARCHIVE}\" in \"${S3_BUCKET}\""
|
||||
rclone copy --progress --transfers=5 --update --s3-chunk-size=${CHUNK_SIZE:-100m} ${ARCHIVE} s3:/${S3_BUCKET}/${S3_ARCHIVE}
|
||||
rclone copy --progress --transfers=5 --update --s3-chunk-size=${CHUNK_SIZE:-500m} ${ARCHIVE} s3:/${S3_BUCKET}/${S3_ARCHIVE}
|
||||
return $?
|
||||
}
|
||||
|
||||
@@ -6,3 +6,4 @@ access_key_id = {{S3_ACCOUNT_ID}}
|
||||
secret_access_key = {{S3_APPLICATION_KEY}}
|
||||
region = {{S3_REGION}}
|
||||
endpoint = https://{{S3_HOST_BASE}}
|
||||
storage_class = {{S3_STORAGE_CLASS}}
|
||||
+2
-2
@@ -1,10 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
DOCKER_BASEIMAGE=ubuntu:20.04
|
||||
DOCKER_BASEIMAGE=ubuntu:24.04
|
||||
DOCKER_MAINTAINER=vasyakrg@gmail.com
|
||||
|
||||
docker buildx create --name cibuilder --driver docker-container --use
|
||||
|
||||
docker buildx build --progress=plain --platform linux/amd64,linux/arm64 --push -t hub.realmanual.ru/images/backup-2:$(cat VERSION) \
|
||||
docker buildx build --progress=plain --platform linux/amd64,linux/arm64 --push -t git.realmanual.ru/pub/backup-2:$(cat VERSION) \
|
||||
--build-arg DOCKER_BASEIMAGE=${DOCKER_BASEIMAGE} \
|
||||
--build-arg DOCKER_MAINTAINER=${DOCKER_MAINTAINER} .
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
.env
|
||||
.idea/
|
||||
@@ -1,207 +0,0 @@
|
||||
Проект содержит скрипты которые обеспечивают сборку контейнера docker и загрузку его в docker registry.
|
||||
|
||||
Состав:
|
||||
* build.sh - скрипт сборки образа
|
||||
* import.sh - скрипт загрузки образа в docker registry
|
||||
* .env - конфигурационный файл для запуска сборки в ручном режиме
|
||||
|
||||
#### Сборка контейнера
|
||||
* Контейнер собирается с использованием Dockerfile либо файла, определяемого переменной `DOCKER_FILE`, из корня проекта. При этом в него передаются параметры:
|
||||
* Контекст сборки может быть определен переменной `DOCKER_BUILD_CONTEXT`, по умолчанию `.`
|
||||
* Для успешной сборки образа, контейнер, в котором происходит сборка (директива `image:` в `.gitlab-ci.yml` файле) должен иметь установленный bash и git.
|
||||
Для этих целей можно использовать образ `docker.ds.mlmsoft.cloud/images/docker`.
|
||||
* Имя базового образа, определяется переменной `DOCKER_BASEIMAGE`
|
||||
(по умолчанию используется `ubuntu:18.04`)
|
||||
* Установка переменной `DOCKER_NO_PULL_BASEIMAGE` в непустое значение позволяет не осуществлять принудительный `docker pull` базового образа
|
||||
* Префикс собираемого локально образа задается переменной `DOCKER_IMAGE_PREFIX`
|
||||
(по умолчанию `mlmsoft`)
|
||||
* Версия базового образа определяется (в порядке приоритета) либо переменной `VERSION`, либо содержимым файла `VERSION` из корня проекта, если файл отсутствует, берется версия `latest`
|
||||
* Maintainer контейнера определяется переменной `DOCKER_MAINTAINER`
|
||||
(по умолчанию указывается email пользователя в gitlab или service@ds.mlmsoft.cloud при локальном запуске, если иное не указано в Dockerfile)
|
||||
* Имя собираемого образа оперделяется переменной `DOCKER_IMAGE_NAME`. По умолчанию используется короткое имя проекта в Gitlab (${CI_PROJECT_PATH#*/})
|
||||
* Тег собираемого образа определяется переменной `DOCKER_IMAGE_TAG`. При отсутствии переменной берется переменная `${VERSION}` и тд
|
||||
* Для передачи произвольных аргументов в Dockerfile можно использовать набор переменных DOCKER_ARG0...DOCKER_ARG9 (соблюдение нумерации не обязательно), в секции `before_script:` .gitlab-ci.yml:
|
||||
|
||||
`export DOCKER_ARG1="VERSION=1.0.0"`
|
||||
|
||||
Переменная VERSION будет доступна в Dockerfile через конструкцию `ARG VERSION`
|
||||
|
||||
Альтернативно можно передевать аргументы в сборку как параметры сборочного скрипта в формате `ARG=value`.
|
||||
|
||||
* Контейнер выкладывается в docker registry `docker.ds.mlmsoft.cloud`, полный путь к контейнеру:
|
||||
|
||||
`docker.ds.mlmsoft.cloud/${CI_PROJECT_NAME}:${VERSION}` если имя образа совпадает с именем проекта, либо
|
||||
`docker.ds.mlmsoft.cloud/${CI_PROJECT_NAME}/${IMAGE_NAME}:${VERSION}` если имя образа отлично от имени проекта
|
||||
|
||||
где:
|
||||
- `${CI_PROJECT_NAME}` полный путь проекта вида `<группа>/имя проекта>` или `<пользователь>/имя проекта>`
|
||||
- `${VERSION}` это версия образа или `latest` в случае ее отсутствия.
|
||||
|
||||
#### Версионность образа
|
||||
Правила формирования версии образа:
|
||||
* Версия образа берется из файла VERSION, который должен располагаться в корне проекта
|
||||
* В случае отсутствия файла, берется версия `:latest`
|
||||
|
||||
Правила определения версии базового образа (DOCKER_BASEIMAGE):
|
||||
* Если в DOCKER_BASEIMAGE есть тег образа, в качестве DOCKER_BASEIMAGE берется значение переменной ${DOCKER_BASEIMAGE} без изменений
|
||||
* Если в DOCKER_BASEIMAGE отсутствует тег образа, то берется ${DOCKER_BASEIMAGE}:${VERSION}
|
||||
|
||||
Правила определения версии итогового образа:
|
||||
* Образ тегируется как ${IMAGE}:${VERSION}
|
||||
* В случае импорта в регистри, образ тегируется как `docker.ds.mlmsoft.cloud/${CI_PROJECT_NAME}:${VERSION}`
|
||||
* В случае, если сборка происходит не из ветки master, образ принудительно тегируется по имени ветки, из которой производится сборка.
|
||||
Если происходит сборка не из ветки master и переменная `DOCKER_IMAGE_TAG` не пустая, то образ тегируется как `$DOCKER_IMAGE_TAG_$BRANCH`.
|
||||
Даннове поведение можно отменить установив переменную `DOCKER_NO_BRANCH_TAG` в непустое значение.
|
||||
|
||||
Дополнительно возможно указать переменную `DOCKER_TAG_AS_LATEST`, которая отвечает за дополнительное тегирование образа тегом `latest` в регистри.
|
||||
|
||||
#### Подключение скриптов к проекту
|
||||
Проект предполагает использование через механизм gitlab submodules или клонирование скриптов при сборке проекта. Примеры файлов и команды находятся в каталоге example/.
|
||||
|
||||
##### Подключение через механизм git submodules
|
||||
Доступно два варианта использования:
|
||||
а) Использование фиксированной версии сборщика
|
||||
б) Использование последней доступной версии
|
||||
|
||||
Для настройки необходимо:
|
||||
1) Однократно выполнить в проекте команду
|
||||
|
||||
`git submodule add -b master ../../infra/ci-build-image.git ci/build-image`
|
||||
|
||||
2) В корне проекта разместить `Dockerfile` вида:
|
||||
```
|
||||
ARG DOCKER_BASEIMAGE
|
||||
FROM ${DOCKER_BASEIMAGE}
|
||||
|
||||
ARG DOCKER_MAINTAINER
|
||||
LABEL maintainer="${DOCKER_MAINTAINER}"
|
||||
|
||||
# Uncomment if you use assets/
|
||||
#COPY assets/ /
|
||||
```
|
||||
3) а) Для использования фиксированной версии в `.gitlab-ci.yml` проекта прописать переменную `GIT_SUBMODULE_STRATEGY=recursive`
|
||||
б) Для использования последней доступной версии в `.gitlab-ci.yml` проекта прописать переменную `GIT_SUBMODULE_STRATEGY=none`
|
||||
|
||||
4) Осуществить вызов сборки в `.gitlab-ci.yml`:
|
||||
а) Вариант фиксированной версии:
|
||||
```
|
||||
image: docker.ds.mlmsoft.cloud/images/docker
|
||||
|
||||
variables:
|
||||
DOCKER_BASEIMAGE: ubuntu:18.04
|
||||
# DOCKER_IMAGE_NAME: ${CI_PROJECT_PATH#*/}
|
||||
# DOCKER_IMAGE_TAG: latest
|
||||
BUILD_SCRIPT: ci/build-image/build.sh
|
||||
GIT_SUBMODULE_STRATEGY: recursive
|
||||
|
||||
#before_script:
|
||||
# - export DOCKER_ARG0="key=value"
|
||||
# - export DOCKER_ARG1="key=value"
|
||||
|
||||
stages:
|
||||
- build
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script:
|
||||
- chmod +x "${BUILD_SCRIPT}" && "./${BUILD_SCRIPT}"
|
||||
when: manual
|
||||
```
|
||||
|
||||
б) Вариант последней доступной версии:
|
||||
```
|
||||
image: docker.ds.mlmsoft.cloud/images/docker
|
||||
|
||||
variables:
|
||||
DOCKER_BASEIMAGE: ubuntu:18.04
|
||||
# DOCKER_IMAGE_NAME: ${CI_PROJECT_PATH#*/}
|
||||
# DOCKER_IMAGE_TAG: latest
|
||||
BUILD_SCRIPT: ci/build-image/build.sh
|
||||
GIT_SUBMODULE_STRATEGY: none
|
||||
|
||||
#before_script:
|
||||
# - export DOCKER_ARG0="key=value"
|
||||
# - export DOCKER_ARG1="key=value"
|
||||
|
||||
stages:
|
||||
- build
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script:
|
||||
- git submodule sync
|
||||
- git submodule update --init --remote --force
|
||||
- chmod +x "${BUILD_SCRIPT}" && "./${BUILD_SCRIPT}"
|
||||
when: manual
|
||||
```
|
||||
|
||||
5) Обновление submodule осуществляется командой:
|
||||
|
||||
`git submodule sync && git submodule update --init --remote`
|
||||
|
||||
##### Клонирование скриптов при сборке проекта
|
||||
|
||||
1) В корне проекта разместить `Dockerfile` вида:
|
||||
```
|
||||
ARG DOCKER_BASEIMAGE
|
||||
FROM ${DOCKER_BASEIMAGE}
|
||||
|
||||
ARG DOCKER_MAINTAINER
|
||||
LABEL maintainer="${DOCKER_MAINTAINER}"
|
||||
|
||||
# Uncomment if you use assets/
|
||||
#COPY assets/ /
|
||||
```
|
||||
|
||||
2) Осуществить вызов сборки в `.gitlab-ci.yml`:
|
||||
```
|
||||
image: docker.ds.mlmsoft.cloud/images/docker
|
||||
|
||||
variables:
|
||||
DOCKER_BASEIMAGE: ubuntu:18.04
|
||||
# DOCKER_IMAGE_NAME: ${CI_PROJECT_PATH#*/}
|
||||
# DOCKER_IMAGE_TAG: latest
|
||||
BUILD_SCRIPT: ci/build-image/build.sh
|
||||
|
||||
#before_script:
|
||||
# - export DOCKER_ARG0="key=value"
|
||||
# - export DOCKER_ARG1="key=value"
|
||||
|
||||
stages:
|
||||
- build
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script:
|
||||
- git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.ds.mlmsoft.cloud/infra/ci-build-image.git ${BUILD_SCRIPT%/*}
|
||||
- chmod +x "${BUILD_SCRIPT}" && "./${BUILD_SCRIPT}"
|
||||
when: manual
|
||||
```
|
||||
|
||||
|
||||
#### Ручной запуск
|
||||
Возможен запуск сборки на локальной машине и выкладывание его в docker registry без внесения изменений в проект. Для этого рядом со сборочными скриптами в `/ci/build-images` должен находиться конфиг с именем `.env` (пример конфига см. в файле `sample.env`):
|
||||
```
|
||||
# Your project target image name and tag
|
||||
DOCKER_IMAGE_NAME=image
|
||||
DOCKER_IMAGE_TAG=latest
|
||||
|
||||
# Base image name and tag
|
||||
DOCKER_BASEIMAGE=ubuntu:18.04
|
||||
|
||||
# Docker build context (leave it as is if not know that it is)
|
||||
DOCKER_BUILD_CONTEXT=.
|
||||
DOCKER_PROJECT=external/project
|
||||
CI_COMMIT_REF_SLUG=master
|
||||
|
||||
# Registry credentials (need only if docker registry upload required)
|
||||
REGISTRY_USER=%YOUR_GITLAB_USERNAME%
|
||||
REGISTRY_PASSWORD=%YOUR_GITLAB_PASSWORD%
|
||||
REGISTRY_URL=docker.ds.mlmsoft.cloud
|
||||
```
|
||||
|
||||
Запуск сборки из каталога проекта: `./ci/build-image/build.sh`
|
||||
|
||||
При ручном запуске автоматическая загрузка в docker registry не происходит, необходимо использовать скрипт `import.sh`:
|
||||
|
||||
`DOCKER_IMAGE=image ./import.sh`
|
||||
@@ -1,76 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
if [[ -n "${BUILD_SCRIPT}" ]]; then SCRIPTS_PATH=${BUILD_SCRIPT%/*}; else SCRIPTS_PATH=ci/build/image; fi
|
||||
DOCKER_BASEIMAGE=${DOCKER_BASEIMAGE:-ubuntu:18.04}
|
||||
DOCKER_MAINTAINER=${DOCKER_MAINTAINER:-$GITLAB_USER_EMAIL}
|
||||
DOCKER_MAINTAINER=${DOCKER_MAINTAINER:-service@ds.mlmsoft.cloud}
|
||||
DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME:-${CI_PROJECT_PATH#*/}}
|
||||
DOCKER_IMAGE_PREFIX=${DOCKER_IMAGE_PREFIX:-mlmsoft}
|
||||
DOCKER_FILE=${DOCKER_FILE:-Dockerfile}
|
||||
|
||||
if [[ -z "${VERSION}" ]]; then
|
||||
if [[ -f "VERSION" ]]; then VERSION=$(cat VERSION); else VERSION=latest; fi
|
||||
fi
|
||||
DOCKER_IMAGE_TAG=${DOCKER_IMAGE_TAG:-$VERSION}
|
||||
if [[ "${CI_COMMIT_REF_SLUG}" != "master" ]]; then
|
||||
if [[ "${DOCKER_IMAGE_TAG}" == "latest" ]]; then TAG=''; else TAG="${DOCKER_IMAGE_TAG}_"; fi
|
||||
echo TAG=${TAG}
|
||||
if [[ -z "${DOCKER_NO_BRANCH_TAG}" ]]; then
|
||||
DOCKER_IMAGE_TAG=${TAG}${CI_COMMIT_REF_SLUG}
|
||||
echo Change DOCKER_IMAGE_TAG=${DOCKER_IMAGE_TAG}
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ -n "${CI}" ]]; then
|
||||
DOCKER_BUILD_CONTEXT=${DOCKER_BUILD_CONTEXT:-'.'}
|
||||
elif [[ -f ${BASH_SOURCE[0]%/*}/.env ]]; then
|
||||
source ${BASH_SOURCE[0]%/*}/.env
|
||||
fi
|
||||
|
||||
BUILD_ARGS=()
|
||||
for var in $@; do
|
||||
[[ "${var}" =~ ^[a-zA-Z0-9+_-]+=.+$ ]] && BUILD_ARGS+=( --build-arg ${var} )
|
||||
done
|
||||
|
||||
for (( i=0; i<10; i++ )); do
|
||||
arg=DOCKER_ARG$i
|
||||
[[ -n ${!arg} ]] && BUILD_ARGS+=( --build-arg ${!arg} )
|
||||
done
|
||||
|
||||
[[ ${DOCKER_BASEIMAGE} != *:* ]] && DOCKER_BASEIMAGE=${DOCKER_BASEIMAGE}:${VERSION}
|
||||
#[[ ${DOCKER_BASEIMAGE} == *:latest ]] && docker pull ${DOCKER_BASEIMAGE}
|
||||
|
||||
# Скачивание базового образа
|
||||
if [[ -z ${DOCKER_NO_PULL_BASEIMAGE:+x} ]]; then
|
||||
docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
|
||||
docker pull ${DOCKER_BASEIMAGE}
|
||||
fi
|
||||
|
||||
echo DOCKER_BASEIMAGE=${DOCKER_BASEIMAGE}
|
||||
echo DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME}
|
||||
echo DOCKER_IMAGE_TAG=${DOCKER_IMAGE_TAG}
|
||||
echo DOCKER_BUILD_CONTEXT=${DOCKER_BUILD_CONTEXT}
|
||||
echo DOCKER_NO_BRANCH_TAG=${DOCKER_NO_BRANCH_TAG}
|
||||
echo DOCKER_NO_PULL_BASEIMAGE=${DOCKER_NO_PULL_BASEIMAGE}
|
||||
echo DOCKER_FILE=${DOCKER_FILE}
|
||||
echo DOCKER_TAG_AS_LATEST=${DOCKER_TAG_AS_LATEST}
|
||||
echo VERSION=${VERSION}
|
||||
echo Building args: ${BUILD_ARGS[@]}
|
||||
|
||||
DOCKER_IMAGE=${DOCKER_IMAGE_PREFIX}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}
|
||||
if ! docker build -f ${DOCKER_FILE} --build-arg DOCKER_BASEIMAGE=${DOCKER_BASEIMAGE} --build-arg DOCKER_MAINTAINER=${DOCKER_MAINTAINER} \
|
||||
--build-arg VERSION=${VERSION} ${BUILD_ARGS[@]} --no-cache --force-rm -t ${DOCKER_IMAGE} ${DOCKER_BUILD_CONTEXT} ; then
|
||||
# Remove all orphaned images after unsuccessfull build
|
||||
docker image prune -f > /dev/null 2>&1
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
#docker tag ${DOCKER_IMAGE_NAME} ${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG}
|
||||
|
||||
if [[ -n "${CI}" ]]; then
|
||||
chmod +x "${SCRIPTS_PATH}/import.sh"
|
||||
DOCKER_IMAGE=${DOCKER_IMAGE} "${SCRIPTS_PATH}/import.sh"
|
||||
fi
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
image: docker.ds.mlmsoft.cloud/images/docker
|
||||
|
||||
variables:
|
||||
DOCKER_BASEIMAGE: ubuntu:18.04
|
||||
# DOCKER_IMAGE_NAME: ${CI_PROJECT_PATH#*/}
|
||||
# DOCKER_IMAGE_TAG: latest
|
||||
BUILD_SCRIPT: ci/build-image/build.sh
|
||||
# GIT_SUBMODULE_STRATEGY: recursive
|
||||
GIT_SUBMODULE_STRATEGY: none
|
||||
|
||||
#before_script:
|
||||
# - export DOCKER_ARG0="key=value"
|
||||
# - export DOCKER_ARG1="key=value"
|
||||
|
||||
stages:
|
||||
- build
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script:
|
||||
- git submodule sync
|
||||
- git submodule update --init --remote --force
|
||||
- chmod +x "${BUILD_SCRIPT}" && "./${BUILD_SCRIPT}"
|
||||
when: manual
|
||||
@@ -1,21 +0,0 @@
|
||||
image: docker.ds.mlmsoft.cloud/images/docker
|
||||
|
||||
variables:
|
||||
DOCKER_BASEIMAGE: ubuntu:18.04
|
||||
# DOCKER_IMAGE_NAME: ${CI_PROJECT_PATH#*/}
|
||||
# DOCKER_IMAGE_TAG: latest
|
||||
BUILD_SCRIPT: ci/build-image/build.sh
|
||||
|
||||
#before_script:
|
||||
# - export DOCKER_ARG0="key=value"
|
||||
# - export DOCKER_ARG1="key=value"
|
||||
|
||||
stages:
|
||||
- build
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script:
|
||||
- git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.ds.mlmsoft.cloud/infra/ci-build-image.git ${BUILD_SCRIPT%/*}
|
||||
- chmod +x "${BUILD_SCRIPT}" && "./${BUILD_SCRIPT}"
|
||||
when: manual
|
||||
@@ -1,8 +0,0 @@
|
||||
ARG DOCKER_BASEIMAGE
|
||||
FROM ${DOCKER_BASEIMAGE}
|
||||
|
||||
ARG DOCKER_MAINTAINER
|
||||
LABEL maintainer="${DOCKER_MAINTAINER}"
|
||||
|
||||
# Uncomment if you use assets/
|
||||
#COPY assets/ /
|
||||
@@ -1,17 +0,0 @@
|
||||
image = image_name
|
||||
|
||||
all: build
|
||||
|
||||
clean:
|
||||
@docker images -f "dangling=true" -q | docker ps -a -f "ancestor={}" -q | xargs --no-run-if-empty docker rm
|
||||
@docker images -f "dangling=true" -q | xargs --no-run-if-empty docker rmi -f
|
||||
|
||||
@docker ps --filter "ancestor=${image}" --format {{.ID}} | xargs --no-run-if-empty docker stop || true
|
||||
@docker ps -a --filter "ancestor=${image}" --format {{.ID}} | xargs --no-run-if-empty docker rm || true
|
||||
@docker images --filter "reference=${image}" --format {{.ID}} | xargs --no-run-if-empty docker rmi || true
|
||||
|
||||
build:
|
||||
@docker build --tag=${image} --no-cache .
|
||||
|
||||
release: build
|
||||
@docker build --tag=${image}:$(shell cat VERSION) .
|
||||
@@ -1 +0,0 @@
|
||||
1.0.0
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
git submodule add -b master ../../infra/ci-build-image.git ci/build-image
|
||||
@@ -1,29 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
if [[ -n "${CI}" ]]; then
|
||||
REGISTRY_USER=gitlab-ci-token
|
||||
# REGISTRY_PASSWORD=${CI_JOB_TOKEN}
|
||||
REGISTRY_URL=${CI_REGISTRY}
|
||||
DOCKER_PROJECT=${CI_PROJECT_PATH}
|
||||
REGISTRY_IMAGE=${DOCKER_IMAGE#*/}
|
||||
[[ "${CI_PROJECT_PATH#*/}" == "${REGISTRY_IMAGE%:*}" ]] && DOCKER_PROJECT=${CI_PROJECT_PATH%/*}
|
||||
elif [[ -f .env ]]; then
|
||||
source ${BASH_SOURCE[0]%/*}/.env
|
||||
CI_JOB_TOKEN=${REGISTRY_PASSWORD}
|
||||
fi
|
||||
|
||||
echo DOCKER_IMAGE=${DOCKER_IMAGE}
|
||||
echo DOCKER_PROJECT=${DOCKER_PROJECT}
|
||||
|
||||
docker login -u ${REGISTRY_USER} -p ${CI_JOB_TOKEN} ${REGISTRY_URL}
|
||||
|
||||
docker tag ${DOCKER_IMAGE} ${REGISTRY_URL}/${DOCKER_PROJECT}/${REGISTRY_IMAGE}
|
||||
docker push ${REGISTRY_URL}/${DOCKER_PROJECT}/${REGISTRY_IMAGE}
|
||||
|
||||
if [[ -n "${DOCKER_TAG_AS_LATEST}" ]]; then
|
||||
REGISTRY_IMAGE=${REGISTRY_IMAGE%:*}:latest
|
||||
docker tag ${DOCKER_IMAGE} ${REGISTRY_URL}/${DOCKER_PROJECT}/${REGISTRY_IMAGE}
|
||||
docker push ${REGISTRY_URL}/${DOCKER_PROJECT}/${REGISTRY_IMAGE}
|
||||
fi
|
||||
@@ -1,16 +0,0 @@
|
||||
# Your project target image name and tag
|
||||
DOCKER_IMAGE_NAME=image
|
||||
DOCKER_IMAGE_TAG=latest
|
||||
|
||||
# Base image name and tag
|
||||
DOCKER_BASEIMAGE=ubuntu:18.04
|
||||
|
||||
# Docker build context (leave it as is if not know that it is)
|
||||
DOCKER_BUILD_CONTEXT=.
|
||||
DOCKER_PROJECT=external/project
|
||||
CI_COMMIT_REF_SLUG=master
|
||||
|
||||
# Registry credentials (need only if docker registry upload required)
|
||||
REGISTRY_USER=%YOUR_GITLAB_USERNAME%
|
||||
REGISTRY_PASSWORD=%YOUR_GITLAB_PASSWORD%
|
||||
REGISTRY_URL=docker.ds.mlmsoft.cloud
|
||||
+5
-3
@@ -1,6 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
source .env
|
||||
image=hub.realmanual.ru/images/backup-2/backup:latest
|
||||
|
||||
docker run --rm --env-file .env --network dalarmbot_net --name test_backup hub.realmanual.ru/images/backup-2:latest
|
||||
echo "Backup create and save to ${STORAGE_HOST}/${STORAGE_PATH}"
|
||||
source .env
|
||||
docker pull $image
|
||||
|
||||
docker run --rm --env-file .env --network dalarmbot_net --name test_backup $image
|
||||
|
||||
Reference in New Issue
Block a user