Контейнеризация Caché

в 14:52, , рубрики: devops, docker, intersystems cache, Администрирование баз данных, Блог компании InterSystems

В этой статье я хочу рассказать про то как можно получить свой образ Docker с InterSystems Caché/Ensemble.

Начнем с самого начала, т.е. с Dockerfile. Dockerfile это простой текстовый файл в формате yml с инструкциями по сборке образа.

Я рекомендую использовать в качестве базового образа CentOS, так как InterSystems официально поддерживает RedHat в качестве основной платформы, и CentOS в качестве платформы для разработки.

FROM centos:6

Вы можете добавить себя в качестве автора файла.

MAINTAINER Dmitry Maslennikov <mrdaimor@gmail.com>

Первым шагом, нужно установить некоторые утилиты которые понадобятся как в процессе установки, так и для работы Caché. Здесь я еще настроил часовой пояс.

# update OS + dependencies & run Caché silent instal
RUN yum -y update 
 && yum -y install which tar hostname net-tools wget 
 && yum -y clean all  
 && ln -sf /etc/locatime /usr/share/zoneinfo/Europe/Moscow

Определим временную папку, для дистрибутива.

ENV TMP_INSTALL_DIR=/tmp/distrib

Определим некоторые аргументы со значениями по умолчанию, которые потом можно будет изменять при сборке.

ARG password="Qwerty@12"
ARG cache=ensemble-2016.2.1.803.0

Теперь нужно определить параметры для автоматической установки.

ENV ISC_PACKAGE_INSTANCENAME="ENSEMBLE" 
    ISC_PACKAGE_INSTALLDIR="/opt/ensemble/" 
    ISC_PACKAGE_UNICODE="Y" 
    ISC_PACKAGE_CLIENT_COMPONENTS="" 
    ISC_PACKAGE_INITIAL_SECURITY="Normal" 
    ISC_PACKAGE_USER_PASSWORD=${password}

Я решил установить безопасность Caché на уровень Normal, и поэтому нужно установить пароль.

В документации можно найти больше вариантов настроек.

В качестве рабочей директории пока установим временную папку для дистрибутива, данной директивой папка будет создана если ранее не существовала.

WORKDIR ${TMP_INSTALL_DIR}

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

COPY cache.key $ISC_PACKAGE_INSTALLDIR/mgr/

Теперь нам нужен дистрибутив для сборки, и есть несколько способов получить его:

  • Загрузить дистрибутив вручную, и положить его рядом с файлом Dockerfile, добавить его такой командой, которая сразу и распакует его по указанному пути.
    ADD $cache-lnxrhx64.tar.gz .

  • Загрузить напрямую с WRC.
    RUN wget -qO /dev/null --keep-session-cookies --save-cookies /dev/stdout --post-data="UserName=$WRC_USERNAME&Password=$WRC_PASSWORD" 'https://login.intersystems.com/login/SSO.UI.Login.cls?referrer=https%253A//wrc.intersystems.com/wrc/login.csp' 
     | wget -O - --load-cookies /dev/stdin "https://wrc.intersystems.com/wrc/WRC.StreamServer.cls?FILE=/wrc/distrib/$cache-lnxrhx64.tar.gz" 
     | tar xvfzC - . 

    В таком случае нужно указать логин и пароль от WRC, чтобы получить доступ к дистрибутиву, и нужно добавить к списку аргументов еще два.

    ARG WRC_USERNAME=”username”
    ARG WRC_PASSWORD=”password”

    Нужно помнить, что любое упомниание паролей в Dockerfile небезопасно, потому что их потом можно вытащить. Так что это не самый безопасный способ.

  • И предпочтительный способ, это хранить дистрибутивы на внутреннем сервере компании, и загружать его оттуда с анонимным доступом.
    RUN wget -O - "ftp://ftp.company.com/cache/$cache-lnxrhx64.tar.gz" 
     | tar xvfzC - .

Все готово к установке, можно запускать.

RUN ./$cache-lnxrhx64/cinstall_silent

После завершения установки, нужно остановить сервер.

RUN ccontrol stop $ISC_PACKAGE_INSTANCENAME quietly

Но это не все, в Docker для работы контейнера нужен один процесс контролирущий процесс. И для этого нам понадобится проект ccontainermain от Luca Ravazzolo. Загрузим бинарник напряму с гитхаба.

# Caché container main process PID 1 (https://github.com/zrml/ccontainermain)
RUN curl -L https://github.com/zrml/ccontainermain/raw/master/distrib/linux/ccontainermain -o /ccontainermain 
 && chmod +x /ccontainermain

Чистим временную папку.

RUN rm -rf $TMP_INSTALL_DIR

Замечание если используется драйвер overlay

Если Docker настроен на работу с драйвером overlay, могут быть проблемы, и нужно добавить такие строки чтобы добавить обертку над ccontrol, иначе при старте Caché он будет сразу выпадать с ошибкой <PROTECT>.

# Workaround for an overlayfs bug which prevents Cache from starting with <PROTECT> errors
COPY ccontrol-wrapper.sh /usr/bin/
RUN cd /usr/bin 
 && rm ccontrol 
 && mv ccontrol-wrapper.sh ccontrol 
 && chmod 555 ccontrol

Код обертки ccontrol-wrapper.sh.

#!/bin/bash

# Work around a weird overlayfs bug where files don't open properly if they haven't been
# touched first - see the yum-ovl plugin for a similar workaround
if [ "${1,,}" == "start" ]; then
    find $ISC_PACKAGE_INSTALLDIR -name CACHE.DAT -exec touch {} ;
fi

/usr/local/etc/cachesys/ccontrol $@

Проверить какой драйвер используется в Docker можно такой командой.

docker info --format '{{.Driver}}'

Workaround для Caché
Немного деталей о баге с OverlayFS

Нужно сообщить Docker какие сетевые порты используются в контейнере, это 57772 для Web доступа и 1972 для бинарного доступа, стандартные порты по умолчанию в Caché.

EXPOSE 57772 1972

И наконец сообщим как запускать контейнер.

ENTRYPOINT ["/ccontainermain", "-cconsole", "-i", "ensemble"]

В итоге файл приобретает такой вид:

FROM centos:6

MAINTAINER Dmitry Maslennikov <Dmitry.Maslennikov@csystem.cz>

# update OS + dependencies & run Caché silent instal
RUN yum -y update 
 && yum -y install which tar hostname net-tools wget 
 && yum -y clean all  
 && ln -sf /etc/locatime /usr/share/zoneinfo/Europe/Prague

ARG password="Qwerty@12"
ARG cache=ensemble-2016.2.1.803.0

ENV TMP_INSTALL_DIR=/tmp/distrib

# vars for Caché silent install
ENV ISC_PACKAGE_INSTANCENAME="ENSEMBLE" 
    ISC_PACKAGE_INSTALLDIR="/opt/ensemble/" 
    ISC_PACKAGE_UNICODE="Y" 
    ISC_PACKAGE_CLIENT_COMPONENTS="" 
    ISC_PACKAGE_INITIAL_SECURITY="Normal" 
    ISC_PACKAGE_USER_PASSWORD=${password} 

# set-up and install Caché from distrib_tmp dir 
WORKDIR ${TMP_INSTALL_DIR}

ADD $cache-lnxrhx64.tar.gz .

# cache distributive
RUN ./$cache-lnxrhx64/cinstall_silent 
 && ccontrol stop $ISC_PACKAGE_INSTANCENAME quietly 
# Caché container main process PID 1 (https://github.com/zrml/ccontainermain)
 && curl -L https://github.com/daimor/ccontainermain/raw/master/distrib/linux/ccontainermain -o /ccontainermain 
 && chmod +x /ccontainermain 
 && rm -rf $TMP_INSTALL_DIR 

WORKDIR ${ISC_PACKAGE_INSTALLDIR}

# TCP sockets that can be accessed if user wants to (see 'docker run -p' flag)
EXPOSE 57772 1972

ENTRYPOINT ["/ccontainermain", "-cconsole", "-i", "ensemble"]

Теперь мы готовы собрать образ. Нужно выполнить такую команду в папке где лежит Dockerfile.
docker build -t ensemble-simple .

В процессе сборки будет загружен исходный образ, и сам процесс установки Caché.

Поменять значения параметров для сборки можно так.

docker build --build-arg password=SuperSecretPassword -t ensemble-simple .

docker build --build-arg cache=ensemble-2016.2.1.803.1 -t ensemble-simple .

И можно запустить новый образ такой командой.

docker run -d -p 57779:57772 -p 1979:1972 ensemble-simple

Здесь 57779 и 1979, это порты по которым контейнер будет доступен с локальной машины.

Такой командой можно увидеть, все запущенные контейнеры.

docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                              NAMES
5f8d2cb3745a        ensemble-simple     "/ccontainermain -..."   18 seconds ago      Up 17 seconds       0.0.0.0:1979->1972/tcp, 0.0.0.0:57779->57772/tcp   keen_carson

Теперь можно открывать портал управления по ссылке http://localhost:57779/csp/sys/UtilHome.csp. Наша новая система работает и доступна.

image

Исходники можно найти на гитхабе здесь.

Автор: InterSystems

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js