В этой статье я хочу рассказать про то как можно получить свой образ 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 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. Наша новая система работает и доступна.
Исходники можно найти на гитхабе здесь.
Поделиться с друзьями
induction
mumps, да вы издеваетесь!
DAiMor
А что вас смущает?
И все таки это не совсем MUMPS, а Cache. И это уже большая разница.
morisson
А что не так? )