В этой статье я хочу рассказать про то как можно получить свой образ Docker с InterSystems Cache/Ensemble. 
Начнем с самого начала, т.е. с Dockerfile. Dockerfile это простой текстовый файл в формате yml с инструкциями по сборке образа.
Я рекомендую использовать в качестве базового образа CentOS, так как InterSystems официально поддерживает RedHat в качестве основной платформы, и CentOS в качестве платформы для разработки.
Вы можете добавить себя в качестве автора файла.
Первым шагом, нужно установить некоторые утилиты которые понадобятся как в процессе установки, так и для работы Cache. Здесь я еще настроил часовой пояс.
Определим временную папку, для дистрибутива.
Определим некоторые аргументы со значениями по умолчанию, которые потом можно будет изменять при сборке.
Теперь нужно определить параметры для автоматической установки.
Я решил установить безопасность Cache на уровень Normal, и поэтому нужно установить пароль.
В документации можно найти больше вариантов настроек.
В качестве рабочей директории пока установим временную папку для дистрибутива, данной директивой папка будет создана если ранее не существовала.
Вы можете сразу добавить файл лицензии, если не собираетесь выкладывать образ в публичные репозитории.
Теперь нам нужен дистрибутив для сборки, и есть несколько способов получить его:
Все готово к установке, можно запускать.
После завершения установки, нужно остановить сервер.
Но это не все, в Docker для работы контейнера нужен один процесс контролирущий процесс. И для этого нам понадобится проект ccontainermain от Luca Ravazzolo. Загрузим бинарник напряму с гитхаба.
Чистим временную папку.
Нужно сообщить Docker какие сетевые порты используются в контейнере, это 57772 для Web доступа и 1972 для бинарного доступа, стандартные порты по умолчанию в Cache.
И наконец сообщим как запускать контейнер.
В итоге файл приобретает такой вид:
Теперь мы готовы собрать образ. Нужно выполнить такую команду в папке где лежит Dockerfile.
В процессе сборки будет загружен исходный образ, и сам процесс установки Cache.
Поменять значения параметров для сборки можно так.
И можно запустить новый образ такой командой.
Здесь 57779 и 1979, это порты по которым контейнер будет доступен с локальной машины.
Такой командой можно увидеть, все запущенные контейнеры.
Теперь можно открывать портал управления по ссылке http://localhost:57779/csp/sys/UtilHome.csp. Наша новая система работает и доступна.

Исходники можно найти на гитхабе здесь.
    
    Начнем с самого начала, т.е. с Dockerfile. Dockerfile это простой текстовый файл в формате yml с инструкциями по сборке образа.
Я рекомендую использовать в качестве базового образа CentOS, так как InterSystems официально поддерживает RedHat в качестве основной платформы, и CentOS в качестве платформы для разработки.
FROM centos:6Вы можете добавить себя в качестве автора файла.
MAINTAINER Dmitry Maslennikov <mrdaimor@gmail.com>Первым шагом, нужно установить некоторые утилиты которые понадобятся как в процессе установки, так и для работы Cache. Здесь я еще настроил часовой пояс.
# update OS + dependencies & run Cache 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}Я решил установить безопасность Cache на уровень 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. Загрузим бинарник напряму с гитхаба.
# Cache 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, иначе при старте Cache он будет сразу выпадать с ошибкой <PROTECT>.
Код обертки ccontrol-wrapper.sh.
Проверить какой драйвер используется в Docker можно такой командой.
Workaround для Cache
Немного деталей о баге с OverlayFS
# 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 для Cache
Немного деталей о баге с OverlayFS
Нужно сообщить Docker какие сетевые порты используются в контейнере, это 57772 для Web доступа и 1972 для бинарного доступа, стандартные порты по умолчанию в Cache.
EXPOSE 57772 1972И наконец сообщим как запускать контейнер.
ENTRYPOINT ["/ccontainermain", "-cconsole", "-i", "ensemble"]В итоге файл приобретает такой вид:
FROM centos:6
MAINTAINER Dmitry Maslennikov <Dmitry.Maslennikov@csystem.cz>
# update OS + dependencies & run Cache 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 Cache 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 Cache 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 # Cache 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 .В процессе сборки будет загружен исходный образ, и сам процесс установки Cache.
Поменять значения параметров для сборки можно так.
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 psCONTAINER 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. Наша новая система работает и доступна.

Исходники можно найти на гитхабе здесь.
Поделиться с друзьями
              
          
 
induction
mumps, да вы издеваетесь!
DAiMor
А что вас смущает?
И все таки это не совсем MUMPS, а Cache. И это уже большая разница.
morisson
А что не так? )