DCTM 16.7 Docker with PostgreSQL install guide

This is a step-by-step guide to install Documentum 16.7 in a Linux environment with PostgreSQL 11 and Docker.

Environment

Host:
Windows 10 x64 8GB RAM
VMware Workstation Player 15

Guest:
CentOS 7.7 x64 25GB HD 4GB RAM 2 cores
PostgreSQL 11
Docker 19.03.4

VM Creation + PostgreSQL 11 configuration

You can just follow the procedure described in Opentext Documentum 16.7 PostgreSQL Developer Edition

Docker configuration

  • Install docker:
[dmadmin@dctm167docker ~]$ sudo yum install -y yum-utils && device-mapper-persistent-data && lvm2
[dmadmin@dctm167docker ~]$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[dmadmin@dctm167docker ~]$ sudo yum install -y docker-ce docker-ce-cli containerd.io
[dmadmin@dctm167docker ~]$ sudo systemctl start docker
  • Install docker compose and check it is correctly installed:
[dmadmin@dctm167docker dctmdocker]$ sudo yum install -y epel-release
[dmadmin@dctm167docker dctmdocker]$ sudo yum install -y python-pip
[dmadmin@dctm167docker dctmdocker]$ sudo pip install docker-compose
[dmadmin@dctm167docker dctmdocker]$ sudo yum upgrade python*
[dmadmin@dctm167docker dctmdocker]$ docker-compose version
docker-compose version 1.24.1, build 4667896
docker-py version: 3.7.3
CPython version: 2.7.5
OpenSSL version: OpenSSL 1.0.2k-fips  26 Jan 2017

Docker configuration

  • Import image:
[dmadmin@dctm167docker dockerimage]$ docker load -i Contentserver_Centos.tar
d69483a6face: Loading layer [==================================================>]  209.5MB/209.5MB
72dea7bec644: Loading layer [==================================================>]  217.2MB/217.2MB
d3468dffaa29: Loading layer [==================================================>]  315.1MB/315.1MB
1f70936ed489: Loading layer [==================================================>]  3.072kB/3.072kB
6a28c1188813: Loading layer [==================================================>]  239.6MB/239.6MB
07cf201dbdc0: Loading layer [==================================================>]  225.8kB/225.8kB
abe3ca337db9: Loading layer [==================================================>]  3.297MB/3.297MB
628e629128da: Loading layer [==================================================>]  46.08kB/46.08kB
4893b60dc3f1: Loading layer [==================================================>]  3.568MB/3.568MB
46d106ddfac4: Loading layer [==================================================>]  94.21kB/94.21kB
49adcbc15f60: Loading layer [==================================================>]  4.121GB/4.121GB
e5fd2930e234: Loading layer [==================================================>]  508.5MB/508.5MB
be7e1221aecc: Loading layer [==================================================>]  679.4kB/679.4kB
6a0c0059135d: Loading layer [==================================================>]  7.168kB/7.168kB
4151aa90b006: Loading layer [==================================================>]   2.56kB/2.56kB
Loaded image: contentserver/centos/stateless/cs:16.7.0000.0810
[dmadmin@dctm167docker dockerimage]$ docker images
REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
contentserver/centos/stateless/cs   16.7.0000.0810      589b5cf8dbc7        8 weeks ago         5.59GB
  • Create PostgreSQL tablespace file:
[dmadmin@dctm167docker dctmdocker]$ su - postgres
Password:
Last login: Sat Oct 19 19:39:49 CEST 2019 on pts/0
-bash-4.2$ mkdir /var/lib/pgsql/11/data/db_dockerdctm167_dat.dat
-bash-4.2$ exit
logout
  • Set required environment variables:
[dmadmin@dctm167docker Scripts]$ vi ~/.bash_profile
export APP_SERVER_PASSWORD=dmadmin
export INSTALL_OWNER_PASSWORD=dmadmin
export ROOT_PASSWORD=dmadmin
export DOCBASE_PASSWORD=dmadmin
export DATABASE_PASSWORD=dmadmin
export GLOBAL_REGISTRY_PASSWORD=dmadmin
export AEK_PASSPHRASE=dmadmin
  • Configure file CS-Docker-Compose_Stateless.yml:
#For description of parameter please do refer to Readme.txt
version: '3.7'
services:
  rcs:
    image: contentserver/centos/stateless/cs:16.7.0000.0810
    environment:
      - DOCKER_HOST=192.168.94.129
      - DATABASE_HOST=192.168.94.129
      - DATABASE_USER=postgres
      - DATABASE_PASSWORD=${DATABASE_PASSWORD}
      - DATABASE_SERVER_PORT=5432
      - SERVICE_NAME=MyPostgres
      - ROOT_PASSWORD=${ROOT_PASSWORD}
      - INSTALL_OWNER=dmadmin
      - INSTALL_OWNER_PASSWORD=${INSTALL_OWNER_PASSWORD}
      - DOCBASE_NAME=dockerdctm167
      - GLOBAL_REGISTRY_PASSWORD=${GLOBAL_REGISTRY_PASSWORD}
      - AEK_ALGORITHM=AES_256_CBC
      - AEK_PASSPHRASE=${AEK_PASSPHRASE}
      - AEK_NAME=CSaek
      - CONFIGURE_THUMBNAIL_SERVER=NO
      - THUMBNAIL_SERVER_PORT=8081
      - THUMBNAIL_SERVER_SSL_PORT=8443
      - EXTERNAL_DOCBROKER_PORT=1689
      - CONTENTSERVER_PORT=50000
      - APP_SERVER_PASSWORD=${APP_SERVER_PASSWORD}
      - INSTALL_OWNER_UID=1000
      - HIGH_VOLUME_SERVER_LICENSE=
      - TRUSTED_LICENSE=
      - STORAGEAWARE_LICENSE=
      - XMLSTORE_LICENSE=
      - SNAPLOCKSTORE_LICENSE=
      - RPS_LICENSE=
      - FED_RECD_SERVICE_LICENSE=
      - RECORD_MANAGER_LICENSE=
      - PRM_LICENSE=
      - DOCBASE_PASSWORD=${DOCBASE_PASSWORD}
      - INSTALLER_UI=silent
      - KEEP_TEMP_FILE=false
      - INSTALLER_DEBUG_LOG=true
      - DOCBASE_ID=453216
      - USE_EXISTING_DATABASE_ACCOUNT=
      - INDEXSPACE_NAME=DM_XCHIVE_DOCBASE
      - USE_EXISTING_AEK=false
    hostname:
      "dockerdctm167"
    container_name:
      "dockerdctm167"
    ports:
      - "1689:1689"
      - "1690:1690"
      - "50000:50000"
      - "50001:50001"
      - "9080:9080"
      - "9082:9082"
      - "9081:9081"
      - "9084:9084"
      - "8081:8081"
      - "8443:8443"
    volumes:
      - DocbaseName_odbc:/opt/dctm/odbc
      - DocbaseName_data:/opt/dctm/data
      - DocbaseName_dba:/opt/dctm/dba
      - DocbaseName_share:/opt/dctm/share
      - DocbaseName_dfc:/opt/dctm/config
      - DocbaseName_mdserver_conf:/opt/dctm/mdserver_conf
      - DocbaseName_mdserver_log:/opt/dctm/wildfly11.0.0/server/DctmServer_MethodServer/log
      - DocbaseName_mdserver_logs:/opt/dctm/wildfly11.0.0/server/DctmServer_MethodServer/logs
      - DocbaseName_Thumbnail_Server_conf:/opt/dctm/product/16.7/thumbsrv/conf
      - DocbaseName_Thumbnail_Server_webinf:/opt/dctm/product/16.7/thumbsrv/container/webapps/thumbsrv/WEB-INF
      - DocbaseName_xhive_storage:/opt/dctm/xhive_storage
      - DocbaseName_XhiveConnector:/opt/dctm/wildfly11.0.0/server/DctmServer_MethodServer/deployments/XhiveConnector.ear
      - DocbaseName_MigrationUtility:/opt/dctm/product/16.7/install/external_apps/MigrationUtil
    privileged: true
#'volumes' service definition:
volumes:
 DocbaseName_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/data
 DocbaseName_share:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/share
 DocbaseName_dba:
 DocbaseName_dfc:
 DocbaseName_odbc:
 DocbaseName_mdserver_conf:
 DocbaseName_mdserver_log:
 DocbaseName_mdserver_logs:
 DocbaseName_Thumbnail_Server_conf:
 DocbaseName_Thumbnail_Server_webinf:
 DocbaseName_XhiveConnector:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/xhive
 DocbaseName_xhive_storage:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/xhive_storage
DocbaseName_MigrationUtility:

Note: As usual, documentation is lacking/wrong and the scripts don’t work at all. This is the list of parameters that I had to change in CS-Docker-Compose_Stateless.yml file in order for docker compose to work:

    image: contentserver/centos/stateless/cs:16.7.0000.0810
    environment:
      - DOCKER_HOST=192.168.94.129
      - DATABASE_HOST=192.168.94.129
      - DOCBASE_NAME=dockerdctm167
    hostname:
      "dockerdctm167"
    container_name:
      "dockerdctm167"
    ports:
      - "1689:1689"
      - "1690:1690"
      - "50000:50000"
      - "50001:50001"
      - "9080:9080"
      - "9082:9082"
      - "9081:9081"
      - "9084:9084"
      - "8081:8081"
      - "8443:8443"
volumes:
 DocbaseName_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/data
 DocbaseName_share:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/share
 DocbaseName_XhiveConnector:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/xhive
 DocbaseName_xhive_storage:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/xhive_storage

Remember that if something goes wrong you’ll have to:

  • Stop the container
  • Delete the container
  • Delete the volumes created

Once the process finishes, you should be able to idql from the container:

[dmadmin@dockerdctm167 ~]$ idql dockerdctm167
Please enter a user (dmadmin):
Please enter password for dmadmin:

        OpenText Documentum idql - Interactive document query interface
        Copyright (c) 2018. OpenText Corporation
        All rights reserved.
        Client Library Release 16.7.0000.0322

Connecting to Server using docbase dockerdctm167
[DM_SESSION_I_SESSION_START]info:  "Session 0106ea608000050f started for user dmadmin."

Connected to OpenText Documentum Server running Release 16.7.0000.0810  Linux64.Postgres
1>

DCTM 16.4 Docker+Oracle installation guide

Since v16.4, Opentext doesn’t provide a “preconfigured” Docker image for Documentum running on Oracle. If you want to use a docker image running PostgreSQL you can use the same procedure as described for Full docker CS7.3 PostgreSQL + D2 4.7 installation guide or DCTM 7.3 PostgreSQL with Docker install guide, and you should not have too many issues 😀

This guide will help you setup a VM running CentOS 7 where we will install Oracle (Express) and docker, and will be building a Documentum image. We will split the build in several images to avoid having to do a full rebuild if something goes wrong 😀

Environment

Host:
Windows 10 x64 8GB RAM
VMware Workstation Player 12

Guest:
CentOS 7 x64 25GB HD 4GB RAM 2 cores
Docker 1.13.1

VM Creation

Mount the CentOS 7 DVD image, boot the machine and follow the steps. You can choose to let EasyInstall do the work for you. I used minimal package install to save resources, named the machine vm-dctmdocker, configure the network and set the root password.

Oracle XE setup

  • I copied every installer in $DOCUMENTUM/installers, so:

[dmadmin@vm-dctmdocker opt]$ sudo mkdir documentum
[dmadmin@vm-dctmdocker opt]$ sudo chown dmadmin.dmadmin documentum
[dmadmin@vm-dctmdocker documentum]$ mkdir installers
[dmadmin@dctmdocker installers]$ cp /mnt/hgfs/dctm72/oracle-xe-11.2.0-1.0.x86_64.rpm/Disk1/oracle-xe-11.2.0-1.0.x86_64.rpm .

  • Install needed libraries, run installer, run configuration tool (remember to change the default 8080 port to something else to avoid conflicts with tomcat if you want to use an application server):

[dmadmin@vm-dctmdocker installers]$ sudo yum install libaio bc
[dmadmin@vm-dctmdocker installers]$ sudo rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm
[dmadmin@vm-dctmdocker installers]$ sudo /etc/init.d/oracle-xe configure

  • Launch sqlplus to enable remote access and remove the password expiration:

[dmadmin@vm-dctmdocker installers]$ . /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh

[dmadmin@vm-dctmdocker installers]$ /u01/app/oracle/product/11.2.0/xe/bin/sqlplus system
EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
quit

Docker setup

We’ll just install docker, adding dmadmin user to the docker group so we don’t need to use sudo every time we want to run the “docker” command

[dmadmin@vm-dctmdocker installers]$ sudo yum install docker
[dmadmin@vm-dctmdocker installers]$ sudo usermod -a -G docker dmadmin
[dmadmin@vm-dctmdocker installers]$ systemctl restart docker.service

Centos docker image setup

This base image will just add required packages and minor configurations:

[dmadmin@vm-dctmdocker installers]$ docker pull centos
[dmadmin@vm-dctmdocker installers]$ docker build –no-cache -f ./customCentosDockerfile -t custom_centos .

customCentosDockerfile:

FROM centos

MAINTAINER aldago

RUN echo root:root | chpasswd

RUN yum install -y rng-tools.x86_64 unzip libaio sudo tail vi openssh-server; \
yum clean all; \
sed -i ‘s/PermitRootLogin without-password/PermitRootLogin yes/’ /etc/ssh/sshd_config; \
sed ‘s@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g’ -i /etc/pam.d/sshd

RUN /sbin/rngd -b -r /dev/urandom -p /dev/random

Documentum base image setup

This image will install Documentum binaries and Oracle client:

[dmadmin@vm-dctmdocker installers]$ docker build –no-cache -f ./dctmcentosDockerfile -t centos_dctm .

Dockerfile:

FROM custom_centos

MAINTAINER aldago

RUN echo root:root | chpasswd

ADD db/install/oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm /tmp/oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm
ADD db/install/oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm /tmp/oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm

RUN rpm -ivh /tmp/oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm /tmp/oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm; \
rm /tmp/oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm; \
rm /tmp/oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm

## create dmadmin user
RUN useradd dmadmin; \
passwd -f -u dmadmin; \
mkdir -p /home/dmadmin/.ssh; chown dmadmin /home/dmadmin/.ssh; chmod 700 /home/dmadmin/.ssh; \
echo “dmadmin ALL=(ALL) ALL” >> /etc/sudoers.d/dmadmin; \
sed -i -e ‘s/Defaults requiretty.*/ #Defaults requiretty/g’ /etc/sudoers

# Create folder structure
RUN mkdir /opt/documentum; \
mkdir /opt/documentum/product; \
mkdir /opt/documentum/product/16.4; \
mkdir /opt/documentum/install; \
mkdir /opt/documentum/db; \
chown -R dmadmin:dmadmin /opt/documentum

ADD cs/install/* /opt/documentum/install/
ADD cs/config/installProperties.properties /opt/documentum/install/
ADD cs/config/configProperties.properties /opt/documentum/install/
ADD cs/config/configPropertiesDoc.properties /opt/documentum/install/

ADD db/config/tnsnames.ora /opt/documentum/db/
ADD db/config/fix_tnsnames.sh /opt/documentum/
RUN chown dmadmin.dmadmin /opt/documentum/fix_tnsnames.sh; \
chown dmadmin.dmadmin /opt/documentum/db/tnsnames.ora; \
chmod u+x /opt/documentum/fix_tnsnames.sh; \
chmod u+g /opt/documentum/db/tnsnames.ora

RUN echo “#dctm services” >> /etc/services ; \
echo “dctm164 49001/tcp # 16.4 Repository native connection” >> /etc/services ; \
echo “dctm164_s 49002/tcp # 16.4 Repository secure connection” >> /etc/services ; \
ln /usr/lib64/libsasl2.so.3 /usr/lib64/libsasl2.so.2; \
ln -s /usr/lib/oracle/11.2/client64/lib/libclntsh.so.11.1 /usr/lib/oracle/11.2/client64/lib/libclntsh.so; \
ln -s /usr/lib/oracle/11.2/client64/lib/libocci.so.11.1 /usr/lib/oracle/11.2/client64/lib/libocci.so; \
chown -R dmadmin:dmadmin /opt/documentum/install; \
chmod u+x /opt/documentum/install/serverSetup.bin

USER dmadmin

ENV DOCUMENTUM /opt/documentum
ENV DM_HOME $DOCUMENTUM/product/16.4
ENV LC_ALL C
ENV JAVA_HOME /opt/documentum/java64/1.8.0_152
ENV ORACLE_HOME /usr/lib/oracle/11.2/client64
ENV ORACLE_SID XE
ENV PATH $ORACLE_HOME/bin:$DM_HOME/bin:$PATH
ENV NLS_LANG AMERICAN_AMERICA.AL32UTF8
ENV LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:$DM_HOME/bin/FIPS/:$JAVA_HOME/jre/lib/amd64/server:$DM_HOME/bin:$LD_LIBRARY_PATH
ENV R_SHLIB_LD_LIBRARY_PATH=$DM_HOME/bin/FIPS
ENV PATH=/usr/lib/oracle/11.2/client64/bin:$PATH
ENV TNS_ADMIN=/opt/documentum/db

RUN $DOCUMENTUM/install/serverSetup.bin -f installProperties.properties

ENV DBHOST 192.168.231.135

RUN /opt/documentum/fix_tnsnames.sh; \
mv $DM_HOME/bin/dmdbtest $DM_HOME/bin/dmdbtest.bak; \
echo “exit 0” >> $DM_HOME/bin/dmdbtest; \
chmod u+x $DM_HOME/bin/dmdbtest

EXPOSE 22

Documentum repository:

This image will run the repository configuration:

[dmadmin@vm-dctmdocker installers]$ docker build –no-cache -t dctm164 .

Dockerfile:

FROM centos_dctm

MAINTAINER aldago

USER dmadmin

ENV DBHOST 192.168.231.135

RUN sed -i “/SERVER.PROJECTED_DOCBROKER_HOST/cSERVER.PROJECTED_DOCBROKER_HOST=$HOSTNAME” /opt/documentum/install/configProperties.properties; \
sed -i “/SERVER.SMTP_SERVER_NAME/cSERVER.SMTP_SERVER_NAME=$HOSTNAME” /opt/documentum/install/configProperties.properties; \
sed -i “/SERVER.FQDN/cSERVER.FQDN=$HOSTNAME” /opt/documentum/install/configProperties.properties; \
/opt/documentum/product/16.4/install/dm_launch_server_config_program.sh -f /opt/documentum/install/configProperties.properties

RUN sed -i “/dfc.session.secure_connect_default/cdfc.session.secure_connect_default=try_native_first” /opt/documentum/config/dfc.properties

EXPOSE 22 1489 1492 49001 49002

ADD cs/config/startup-dctm.sh /opt/documentum/startup-dctm.sh

USER root
RUN chown dmadmin.dmadmin /opt/documentum/startup-dctm.sh; \
chmod u+x /opt/documentum/startup-dctm.sh

USER dmadmin
CMD /opt/documentum/fix_tnsnames.sh; /opt/documentum/startup-dctm.sh ; bash

Additional information

Custom scripts created for the install:

  • startup-dctm.sh: updates hostname, dfc.properties, runs dm_crypto_boot and starts the repository services.
  • fix_tnsnames.sh: updates tnsnames with Oracle server public IP (which in this example is hardcoded)
  • configProperties.properties: Standard silent install script

If something goes wrong at some point, remember you’ll need to:

  • Delete docker dangling containers
  • Delete user created on database by the installer
  • Delete tablespaces created on database by the installer