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

от автора

В этой статье я хочу рассказать про то как можно получить свой образ 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

Исходники можно найти на гитхабе здесь.
ссылка на оригинал статьи https://habrahabr.ru/post/323746/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *