{"id":12844,"date":"2019-10-01T21:31:36","date_gmt":"2019-10-01T19:31:36","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/"},"modified":"2025-10-24T09:32:12","modified_gmt":"2025-10-24T07:32:12","slug":"a-small-footprint-container-with-idql-iapi-clients","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/","title":{"rendered":"A Small Footprint Docker Container with Documentum command-line Tools"},"content":{"rendered":"<p>The aim here is to have a minimalist container with the usual Documentum clients idql, iapi, dmawk and dmqdocbroker.<br \/>\nDocumentum Administrator (DA) could also be a useful addition to our toolbox. We will show how to containerize it in a future article. A word of warning is in order here: the title&#8217;s catchy &#8220;small footprint&#8221; qualifier is relative. Don&#8217;t forget that said container will contain a certified O\/S, a JRE, the DFCs and a few support shared libraries. Under these conditions, at more than 600 Mb, it is as small as it can get.<br \/>\nSince those clients are part of the content server (CS) and not packaged separately, we must first start with a full installation of the content server binaries and next we&#8217;ll remove all the non-essential parts. We chose the latest available CS version, currently v16.4.<br \/>\nThe cute little utility dctm-wrapper discussed in <a title=\"Connecting to a Repository via a Dynamically Edited dfc.properties File (part I)\" href=\"https:\/\/www.dbi-services.com\/blog\/connecting-to-a-repository-via-a-dynamically-edited-dfc-properties-file-part-i\/\" target=\"_blank\" rel=\"noopener noreferrer\">Connecting to a Repository via a Dynamically Edited dfc.properties File (part I)<\/a> is also included because it makes it unnecessary to manually edit the container&#8217;s dfc.properties file each time a new repository on a different machine needs to be accessed; this will be done dynamically by the utility itself.<br \/>\nThe instructions to create the image are given in a dockerfile. We chose to base the image on the Centos distribution because as a Red Hat derivative it is implicitly certified and does not require any subscription. However, any other Documentum-certified Linux distribution such as RedHat, Suze or Ubuntu will do. Some adaptation may be in order though, e.g. adding libraries to $LD_LIBRARY_PATH or syminking libraries under another version suffix. Check the installation manual for details.<br \/>\nThe working directory is quite flat:<br \/>\n<code><br \/>\ndmadmin@dmclient:~\/builds\/documentum\/clients$ ll -R<br \/>\n.:<br \/>\ntotal 24<br \/>\n-rw-rw-r-- 1 dmadmin dmadmin   68 Aug  1 10:28 dctm-secrets<br \/>\ndrwxrwxr-x 2 dmadmin dmadmin 4096 Aug  2 11:55 files<br \/>\n-rw-rw-r-- 1 dmadmin dmadmin 7107 Aug 28 23:49 Dockerfile<br \/>\n&nbsp;<br \/>\n.\/files:<br \/>\ntotal 2151304<br \/>\n-rw-rw-r-- 1 dmadmin dmadmin        872 Aug  1 10:28 linux_install_properties<br \/>\n-rwxrwxr-x 1 dmadmin dmadmin 1393568256 Aug  1 10:28 content_server_16.4_linux64_oracle.tar<br \/>\n-rwxrwxr-x 1 dmadmin dmadmin  809339975 Aug  1 10:28 CS_16.4.0080.0129_linux_ora_P08.tar.gz<br \/>\n-rw-rw-r-- 1 dmadmin dmadmin        349 Aug  1 10:28 CS_patch08.properties<br \/>\n-rwxrwxr-x 1 dmadmin dmadmin       7090 Aug  2 11:55 dctm-wrapper<br \/>\n<\/code><br \/>\nThere is only one sub-directory, files. Read on for more details.<\/p>\n<h2>The clients dockerfile<\/h2>\n<p>Let&#8217;s take a look at the clients dockerfile:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [1,5,8,10,31,39,44,59,64,66,68,77,79]\">\n# syntax = docker\/dockerfile:1.0-experimental\n# we are using the secret mount type;\n# cec - dbi-services - July 2019\n\nFROM centos:latest\nMAINTAINER \"cec@dbi\"\n\nRUN yum install -y sudo less unzip gunzip tar iputils hostname gawk wget bind-utils net-tools &amp;&amp; yum clean all\n\nARG soft_repo\nARG INSTALL_OWNER\nARG INSTALL_OWNER_UID\nARG INSTALL_OWNER_GROUP\nARG INSTALL_OWNER_GID\nARG INSTALL_HOME\nARG INSTALL_TMP\nARG PRODUCT_MAJOR_VERSION\nARG JBOSS\nARG DOCUMENTUM\nARG DOCUMENTUM_SHARED\nARG DM_HOME\nARG MNT_SHARED_FOLDER\nARG SCRIPTS_DIR\n\nENV LC_ALL C\n\nUSER root\nRUN mkdir -p ${INSTALL_TMP} ${SCRIPTS_DIR} ${DOCUMENTUM} ${MNT_SHARED_FOLDER}\n\n# copy the uncompressed files;\nCOPY ${soft_repo}\/CS_patch08.properties ${soft_repo}\/linux_install_properties ${soft_repo}\/dctm-wrapper ${INSTALL_TMP}\/.\n\n# copy and expand the packages;\nADD ${soft_repo}\/content_server_16.4_linux64_oracle.tar ${INSTALL_TMP}\/.\nADD ${soft_repo}\/CS_16.4.0080.0129_linux_ora_P08.tar.gz ${INSTALL_TMP}\/.\n\nRUN groupadd --gid ${INSTALL_OWNER_GID} ${INSTALL_OWNER_GROUP}                                                                                       &amp;&amp; \n    useradd --uid ${INSTALL_OWNER_UID} --gid ${INSTALL_OWNER_GID} --shell \/bin\/bash --home-dir \/home\/${INSTALL_OWNER} --create-home ${INSTALL_OWNER} &amp;&amp; \n    usermod -a -G wheel ${INSTALL_OWNER}                                                                                                             &amp;&amp; \n    chown -R ${INSTALL_OWNER}:${INSTALL_OWNER_GROUP} ${INSTALL_HOME} ${INSTALL_TMP} ${SCRIPTS_DIR} ${DOCUMENTUM} ${MNT_SHARED_FOLDER}                &amp;&amp; \n    chmod 775 ${INSTALL_HOME} ${INSTALL_TMP} ${SCRIPTS_DIR} ${DOCUMENTUM} ${MNT_SHARED_FOLDER}\n\n# set the $INSTALL_OWNER's password passed in the secret file;\nRUN --mount=type=secret,id=dctm-secrets,dst=\/dctm-secrets . \/dctm-secrets &amp;&amp; echo ${INSTALL_OWNER}:\"${INSTALL_OWNER_PASSWORD}\" | \/usr\/sbin\/chpasswd\nRUN rm \/tmp\/dctm-secrets\n\n# make the CLI comfortable again;\nUSER ${INSTALL_OWNER}\nRUN echo &gt;&gt; ${HOME}\/.bash_profile                                          &amp;&amp; \n    echo \"set -o vi\" &gt;&gt; ${HOME}\/.bash_profile                              &amp;&amp; \n    echo \"alias ll='ls -alrt'\" &gt;&gt; ${HOME}\/.bash_profile                    &amp;&amp; \n    echo \"alias psg='ps -ef | grep -i'\" &gt;&gt; ${HOME}\/.bash_profile           &amp;&amp; \n    echo \"export DM_HOME=${DM_HOME}\"           &gt;&gt; ${HOME}\/.bash_profile    &amp;&amp; \n    echo \"export DOCUMENTUM=${DOCUMENTUM}\"     &gt;&gt; ${HOME}\/.bash_profile    &amp;&amp; \n    echo \"export PATH=.:${SCRIPTS_DIR}:$PATH\" &gt;&gt; ${HOME}\/.bash_profile    &amp;&amp; \n    echo &gt;&gt; ${HOME}\/.bash_profile                                          &amp;&amp; \n    echo \"[[ -f ${DM_HOME}\/bin\/dm_set_server_env.sh ]] &amp;&amp; . ${DM_HOME}\/bin\/dm_set_server_env.sh 2&gt;&amp;1 &gt; \/dev\/null || true\" &gt;&gt; ${HOME}\/.bash_profile &amp;&amp; \n    echo &gt;&gt; ${HOME}\/.bash_profile                                          &amp;&amp; \n    mv ${INSTALL_TMP}\/dctm-wrapper ${SCRIPTS_DIR}\/. &amp;&amp; chmod +x ${SCRIPTS_DIR}\/dctm-wrapper &amp;&amp; \n    ln -s ${SCRIPTS_DIR}\/dctm-wrapper ${SCRIPTS_DIR}\/widql &amp;&amp; ln -s ${SCRIPTS_DIR}\/dctm-wrapper ${SCRIPTS_DIR}\/wiapi &amp;&amp; ln -s ${SCRIPTS_DIR}\/dctm-wrapper ${SCRIPTS_DIR}\/wdmawk\n\n# install and then cleanup useless stuff from image;\nWORKDIR ${DOCUMENTUM}\nRUN . ${HOME}\/.bash_profile &amp;&amp; cd ${INSTALL_TMP} &amp;&amp; .\/serverSetup.bin -f .\/linux_install_properties &amp;&amp; echo $? &amp;&amp; \n    tar xvf CS_16.4.0080.0129_linux_ora_P08.tar &amp;&amp; \n    chmod +x .\/patch.bin &amp;&amp; .\/patch.bin LAX_VM $DOCUMENTUM\/java64\/JAVA_LINK\/jre\/bin\/java -f CS_patch08.properties &amp;&amp; echo $? &amp;&amp; \n    cd ${DOCUMENTUM} &amp;&amp; rm -r ${INSTALL_TMP} \/tmp\/install* &amp;&amp; \n    rm -r tcf &amp;&amp; rm -r tools &amp;&amp; rm -r ${JBOSS} &amp;&amp; rm -r jmsTools &amp;&amp; rm -r uninstall &amp;&amp; rm -r dba &amp;&amp; rm -r java64\/1.8.0_152\/db &amp;&amp; rm -r java64\/1.8.0_152\/include &amp;&amp; rm java64\/1.8.0_152\/javafx-src.zip &amp;&amp; \n    rm java64\/1.8.0_152\/src.zip &amp;&amp; rm -r java64\/1.8.0_152\/man &amp;&amp; rm -r temp\/* &amp;&amp; \n    cd ${DOCUMENTUM}\/product\/16.4\/ &amp;&amp; \n    rm -r diagtools &amp;&amp; rm -r lib &amp;&amp; rm -r convert &amp;&amp; rm -r unsupported &amp;&amp; rm -r oracle &amp;&amp; rm -r install &amp;&amp; mkdir smaller_bin &amp;&amp; mv bin\/dm_set_server_env.sh smaller_bin\/. &amp;&amp; mv bin\/iapi* smaller_bin\/. &amp;&amp; \n    mv bin\/idql* smaller_bin\/. &amp;&amp; mv bin\/dmqdocbroker* smaller_bin\/. &amp;&amp; mv bin\/dmawk* smaller_bin\/. &amp;&amp; mv bin\/libkmclient_shared.so* smaller_bin\/. &amp;&amp; mv bin\/libdmcl*.so* smaller_bin\/. &amp;&amp; \n    mv bin\/libsm_sms.so* smaller_bin\/. &amp;&amp; mv bin\/libsm_clsapi.so* smaller_bin\/. &amp;&amp; mv bin\/libsm_env.so* smaller_bin\/. &amp;&amp; mv bin\/java.ini smaller_bin\/. &amp;&amp; rm -r bin &amp;&amp; mv smaller_bin bin &amp;&amp; \n    cd ${DOCUMENTUM}\/dfc\/ &amp;&amp; for f in *; do mv $f _${f}; done &amp;&amp; mv _aspectjrt.jar aspectjrt.jar &amp;&amp; mv _commons-lang-2.6.jar commons-lang-2.6.jar &amp;&amp; mv _dfc.jar dfc.jar &amp;&amp; mv _log4j.jar log4j.jar &amp;&amp; rm -r _* \n\n# keep the container rolling;\nCMD bash -c \"while true; do sleep 60; done\"\n\n# build the image;\n# copy\/paste the commented lines below starting with the cat command uncommented:\n# cat - &lt;&lt;&#039;eot&#039; | gawk &#039;{gsub(\/#+ *\/, &quot;&quot;); print}&#039;\n# export INSTALL_OWNER=dmadmin\n# export INSTALL_OWNER_UID=1000 \n# export INSTALL_OWNER_GROUP=${INSTALL_OWNER}\n# export INSTALL_OWNER_GID=1000\n# export INSTALL_HOME=\/app\n# export INSTALL_TMP=${INSTALL_HOME}\/tmp\n# export SCRIPTS_DIR=${INSTALL_HOME}\/scripts\n# export PRODUCT_MAJOR_VERSION=16.4\n# export JBOSS=wildfly9.0.1\n# export DOCUMENTUM=${INSTALL_HOME}\/dctm \n# export DOCUMENTUM_SHARED=${DOCUMENTUM}\n# export DM_HOME=${DOCUMENTUM}\/product\/${PRODUCT_MAJOR_VERSION}\n# export MNT_SHARED_FOLDER=${INSTALL_HOME}\/shared\n# time DOCKER_BUILDKIT=1 docker build --squash --no-cache --progress=plain --secret id=dctm-secrets,src=.\/dctm-secrets \n#  --build-arg soft_repo=.\/files                              \n#  --build-arg INSTALL_OWNER=${INSTALL_OWNER}                 \n#  --build-arg INSTALL_OWNER_UID=${INSTALL_OWNER_UID}         \n#  --build-arg INSTALL_OWNER_GROUP=${INSTALL_OWNER_GROUP}     \n#  --build-arg INSTALL_OWNER_GID=${INSTALL_OWNER_GID}         \n#  --build-arg INSTALL_HOME=${INSTALL_HOME}                   \n#  --build-arg INSTALL_TMP=${INSTALL_TMP}                     \n#  --build-arg PRODUCT_MAJOR_VERSION=${PRODUCT_MAJOR_VERSION} \n#  --build-arg JBOSS=${JBOSS}                                 \n#  --build-arg DOCUMENTUM=${DOCUMENTUM}                       \n#  --build-arg DOCUMENTUM_SHARED=${DOCUMENTUM_SHARED}         \n#  --build-arg DM_HOME=${DM_HOME}                             \n#  --build-arg MNT_SHARED_FOLDER=${MNT_SHARED_FOLDER}         \n#  --build-arg SCRIPTS_DIR=${SCRIPTS_DIR}                     \n#  --tag=&quot;dbi\/dctm-clients:v1.0&quot;                              \n#  .\n# eot\n# retag the squashed image as it has not tag:\n# docker tag &lt;image_id&gt; dbi\/dctm-clients:v1.0\n\n# run the image and remove the container on exit;\n# docker run -d --rm --hostname=container-clients dbi\/dctm-clients:v1.0\n\n# run the image and keep the container on exit;\n# docker run -d --name container-clients --hostname=container-clients dbi\/dctm-clients:v1.0\n\n# for trans-host container access, connect the container to an existing overlay or macvlan network, e.g.:\n# docker network connect dctmolnet01 container-clients\n<\/pre>\n<p>The pragma on line 1 says that we will be using an experimental feature that needs a special syntax, see below for details.<br \/>\nOn line 5, we access the docker on-line registry to download an image of Centos and base our own image on it. We will also throw in a few utilities that can be helpful later.<br \/>\nOn lines 10 to 23 we use ARG to receive the parameters passed to the build. We could have used ENV instead and hard-coded them in the dockerfile but the problem with that alternative is that those environment variables would have persisted in the containers derived from the image and since they are not used outside the build, they would just unnecessarily pollute the environment. Docker has currently no way to remove environment variables. They can be set to an empty value though, but this is not enough.<br \/>\nOn line 31, the needed files, the CS and patch installation archives along with their property files plus anything else, are imported into the image from the local host&#8217;s directory ${soft_repo}. This directory must be local to the current one and both should only contain the exact needed files in order to keep the build context small. In effect, during the context creation, the current directory and everything under it will be recursively read, which is quite a slow process.<br \/>\nOn line 39, the user dmadmin is added to the wheel group. This is a convenient trick in Centos to make dmadmin a sudoer of any command.<br \/>\nOn line 44, the experimental feature &#8220;secrets&#8221; is finally used. This enhancement lets us pass a file containing confidential information, typically passwords, without leaving any traces in the image&#8217;s overlay filesystems. The RUN statement is executed atomically and, at the end, the mounted file is dismounted silently. Outside that RUN statement, it is like nothing had happened but we quietly managed to change dmadmin user&#8217;s password. Here is its content:<br \/>\n<code><br \/>\ndmadmin@dmclient:~\/builds\/documentum\/da$ cat dctm-secrets<br \/>\nexport INSTALL_OWNER=dmadmin<br \/>\nexport INSTALL_OWNER_PASSWORD=dmadmin<br \/>\n<\/code><br \/>\nIt is a bash file that is sourced in the RUN statement to give access to the key-value tuples through environment variables.<br \/>\nOn lines 59 and 60, dctm-wrapper is installed as explained in the aforementioned article, i.e. by symlinking it to widql, wiapi and wdmawk. When any of these programs is executed, it will be resolved to the wrapper, which knows what to do next. Please, refer to that article for details.<br \/>\nOn lines 64, the Documentum content server is installed in silent mode; the parameter file is the default sample one:<br \/>\n<code><br \/>\ndmadmin@dmclient:~\/builds\/documentum\/clients$ cat files\/linux_install_properties<br \/>\n# silent install response file<br \/>\n# used to install the binaries;<br \/>\n&nbsp;<br \/>\nINSTALLER_UI=silent<br \/>\nKEEP_TEMP_FILE=false<br \/>\n&nbsp;<br \/>\n####installation<br \/>\n##default documentum home directory, on linux, this attribute is supposed to be set in the env so don't need<br \/>\n##SERVER.DOCUMENTUM=\/opt\/documentum<br \/>\n##app server port<br \/>\nAPPSERVER.SERVER_HTTP_PORT=9080<br \/>\n##app server password<br \/>\nAPPSERVER.SECURE.PASSWORD=jboss<br \/>\n##enable cas as default<br \/>\nSERVER.CAS_LICENSE=XXXXXXXXX<br \/>\n&nbsp;<br \/>\n# provide the lockboxpassphrase for existing lockbox files. the file name and lockboxpassphrase must be start with 1 and sequentially increased and cannot skip any number<br \/>\n# for example, SERVER.LOCKBOX_FILE_NAME1=lockbox1.lb, SERVER.LOCKBOX_FILE_NAME2=lockbox2.lb, SERVER.LOCKBOX_FILE_NAME3=lockbox3.lb<br \/>\n# same rule applies to SERVER.LOCKBOX_PASSPHRASE.PASSWORD=<br \/>\nSERVER.LOCKBOX_FILE_NAME1=lockbox.lb<br \/>\nSERVER.LOCKBOX_PASSPHRASE.PASSWORD1=<br \/>\n<\/code><br \/>\nSince we do not create repositories but just use a minimalist set of files needed by the clients, that file could be simplified to:<br \/>\n<code><br \/>\n# silent install response file<br \/>\nINSTALLER_UI=silent<br \/>\nKEEP_TEMP_FILE=false<br \/>\n<\/code><br \/>\nOn line 66, the patch P08, the latest available one for CS v16.4 as of this writing, is extracted and on the next line it is installed in silent mode too. Its edited property file CS_patch08.properties looks like this:<br \/>\n<code><br \/>\ndmadmin@dmclient:~\/builds\/documentum\/clients$ cat files\/CS_patch08.properties<br \/>\n# Sun Apr 28 13:24:15 CEST 2019<br \/>\n# Replay feature output<br \/>\n# ---------------------<br \/>\n# This file was built by the Replay feature of InstallAnywhere.<br \/>\n# It contains variables that were set by Panels, Consoles or Custom Code.<br \/>\n&nbsp;<br \/>\n#all<br \/>\n#---<br \/>\nINSTALLER_UI=silent<br \/>\nUSER_SELECTED_PATCH_ZIP_FILE=CS_16.4.0080.0129_linux_ora.tar.gz<br \/>\ncommon.installLocation=\/app\/dctm<br \/>\n<\/code><br \/>\nLines 68 to 74 delete all the files from the content server package that are not used by the clients. Small files are not worth the effort so they are left behind.<br \/>\nThe DFCs have been empirically kept to a minimum. Normally, there should not be any surprise because the iapi, idql and dmawk are legacy clients that only scratch the surface of the DFCs and don&#8217;t use any other jars.<br \/>\nOn line 77, an endless loop is defined in order to keep the container running. In effect, if no process is (no longer) running inside a container, that container will be shut down. Here, the container does nothing per se, it just provides tools to be invoked externally and would exit immediately if it weren&#8217;t for the sleeping loop.<br \/>\nStarting with line 79, the commented out instructions to build and run the image are listed, for we feel it is handy to have them all in one place. They could also be wrapped up into a script file if this is more convenient.<\/p>\n<h2>Building the image<\/h2>\n<p>To build the image, use the command below:<\/p>\n<pre class=\"brush: bash; gutter: true; first-line: 1; highlight: [14,30]\">\nexport INSTALL_OWNER=dmadmin\nexport INSTALL_OWNER_UID=1000\nexport INSTALL_OWNER_GROUP=${INSTALL_OWNER}\nexport INSTALL_OWNER_GID=1000\nexport INSTALL_HOME=\/app\nexport INSTALL_TMP=${INSTALL_HOME}\/tmp\nexport SCRIPTS_DIR=${INSTALL_HOME}\/scripts\nexport PRODUCT_MAJOR_VERSION=16.4\nexport JBOSS=wildfly9.0.1\nexport DOCUMENTUM=${INSTALL_HOME}\/dctm\nexport DOCUMENTUM_SHARED=${DOCUMENTUM}\nexport DM_HOME=${DOCUMENTUM}\/product\/${PRODUCT_MAJOR_VERSION}\nexport MNT_SHARED_FOLDER=${INSTALL_HOME}\/shared\ntime DOCKER_BUILDKIT=1 docker build --squash --no-cache --progress=plain --secret id=dctm-secrets,src=.\/dctm-secrets \n--build-arg soft_repo=.\/files                              \n--build-arg INSTALL_OWNER=${INSTALL_OWNER}                 \n--build-arg INSTALL_OWNER_UID=${INSTALL_OWNER_UID}         \n--build-arg INSTALL_OWNER_GROUP=${INSTALL_OWNER_GROUP}     \n--build-arg INSTALL_OWNER_GID=${INSTALL_OWNER_GID}         \n--build-arg INSTALL_HOME=${INSTALL_HOME}                   \n--build-arg INSTALL_TMP=${INSTALL_TMP}                     \n--build-arg PRODUCT_MAJOR_VERSION=${PRODUCT_MAJOR_VERSION} \n--build-arg JBOSS=${JBOSS}                                 \n--build-arg DOCUMENTUM=${DOCUMENTUM}                       \n--build-arg DOCUMENTUM_SHARED=${DOCUMENTUM_SHARED}         \n--build-arg DM_HOME=${DM_HOME}                             \n--build-arg MNT_SHARED_FOLDER=${MNT_SHARED_FOLDER}         \n--build-arg SCRIPTS_DIR=${SCRIPTS_DIR}                     \n--tag=\"dbi\/dctm-clients:v1.0\"                              \n.\n<\/pre>\n<p>Don&#8217;t forget the tiny little dot at the bottom \ud83d\ude09<br \/>\nThe instructions are given on lines 81 to 112 in the dockfile too. Just uncomment the first line (the cat command), copy\/paste all the lines up to the dot included and add a line containing only the word &#8220;eot&#8221; to close the here-document; afterwards, copy\/paste all the generated text on the shell and Bob&#8217;s your uncle.<br \/>\nThe image creation takes up a little under 5.5 minutes on my old, faithful machine, mostly taken up by the Documentum installer (3mn) and next by the &ndash;&ndash;squash option on line 14 (42s). This too is an experimental option that merges together all the file system layers into a single one and removes deleted files. The net result is a much more compact image, it goes from 5.06 Gb down to 625 Mb. We *have* to use it here otherwise there would be no point in going through the effort of removing unnecessary files to produce an as compact as possible image.<br \/>\nThe resulting size is now exactly the one effectively taken up by all the files in the image as shown from within a running image:<br \/>\n<code><br \/>\n[dmadmin@container-clients dctm]$ sudo du -ms \/<br \/>\n...<br \/>\n622\t\/<br \/>\n<\/code><br \/>\nThere are pros and cons of using &ndash;&ndash;squash but that option has no perceptible drawbacks in our case.<br \/>\nLet&#8217;s now look at the produced images&#8217;sizes from the outside:<\/p>\n<pre class=\"brush: bash; gutter: false; highlight: []\">\ndmadmin@dmclient:~\/builds\/documentum\/clients$ docker image ls\nREPOSITORY            TAG                 IMAGE ID            CREATED             SIZE\n&lt;none&gt;                &lt;none&gt;              85b59eb66c00        3 minutes ago       625MB\ndbi\/dctm-clients      v1.0                bb0038f8a577        4 minutes ago       5.06GB\n<\/pre>\n<p>Note that the &ndash;&ndash;squash option produced a new image, here with the id 85b59eb66c00. We&#8217;d expect it to replace the original image instead of creating a new one but it&#8217;s OK too, we have both now, the original one and the squashed one. Note also how that image&#8217;s size has shrunk almost ten-fold. Let&#8217;s tag it the way it should have been:<\/p>\n<pre class=\"brush: bash; gutter: false; highlight: []\">\ndmadmin@dmclient:~\/builds\/documentum\/clients$ docker tag 85b59eb66c00 dbi\/dctm-clients:v1.0\ndmadmin@dmclient:~\/builds\/documentum\/clients$ docker image ls\nREPOSITORY            TAG                 IMAGE ID            CREATED             SIZE\ndbi\/dctm-clients      v1.0                85b59eb66c00        About an hour ago   625MB\n...\n<\/pre>\n<h2>Running the image<\/h2>\n<p>To run the image as a temporary container, use the command below:<br \/>\n<code><br \/>\ndmadmin@dmclient:~\/builds\/documentum\/clients$ docker run -d <strong>--rm<\/strong> --hostname=container-clients dbi\/dctm-clients:v1.0<br \/>\n<\/code><br \/>\nTo run the image and keep the container under the name container-clients on exit:<\/p>\n<pre class=\"brush: bash; gutter: false; highlight: []\">\ndmadmin@dmclient:~\/builds\/documentum\/clients$ docker run -d <strong>--name container-clients<\/strong> --hostname=container-clients dbi\/dctm-clients:v1.0\n# check it:\ndmadmin@dmclient:~\/builds\/documentum\/clients$ docker container ls\nCONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES\n97dd2f14e3ef        dbi\/dctm-clients:v1.0   \"\/bin\/sh -c 'bash -c\u2026\"   5 seconds ago       Up 3 seconds                                 container-clients\n...\n<\/pre>\n<p>Good. Let&#8217;s now move on and test the container. Note that usually we specify a network the container should be connected into, either when starting it or later, as shown in the example below with a custom bridge network named dctmbrnet:<br \/>\n<code><br \/>\n# connect the container to a custom bridge network after it has been started:<br \/>\ndocker network connect dctmbrnet container-client<br \/>\n&nbsp;<br \/>\n# connect the container to a custom bridge network when starting it up:<br \/>\ndmadmin@dmclient:~\/builds\/documentum\/clients$ docker run -d --name container-clients --hostname=container-clients --network dctmbrnet dbi\/dctm-clients:v1.0<br \/>\n<\/code><\/p>\n<h2>Testing the container-clients container from the inside<\/h2>\n<p>In this scenario, we need first to enter the container and then to run the usual command-line clients.<br \/>\nLet&#8217;s suppose the container is connected to some network that allows it to access remote containerized repositories. Such network can be a simple bridge network if the repositories&#8217; containers and the container-client&#8217;s container are on the same host. Or it can be an overlay network or a macvlan network if the containers are distributed across several hosts. Or it can be any non docker network, e.g. managed by Kubernetes. So, let&#8217;s first enter the container-client&#8217;s container and then test the tools:<br \/>\n<code><br \/>\n# enter container-client from its host:<br \/>\ndmadmin@dmclient:~\/builds\/documentum\/clients$ docker exec -it container-client \/bin\/bash -l<br \/>\n&nbsp;<br \/>\n# connect to the container02's dmtest02 repository:<br \/>\n[dmadmin@container-clients dctm]$ widql dmtest02:container02:1489 -Udmadmin -Pdmadmin<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n\tOpenText Documentum idql - Interactive document query interface<br \/>\n\tCopyright (c) 2018. OpenText Corporation<br \/>\n\tAll rights reserved.<br \/>\n\tClient Library Release 16.4.0070.0035<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\nConnecting to Server using docbase dmtest02<br \/>\n[DM_SESSION_I_SESSION_START]info:  \"Session 0100c35080002a52 started for user dmadmin.\"<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\nConnected to OpenText Documentum Server running Release 16.4.0080.0129  Linux64.Oracle<br \/>\n1&gt; quit<br \/>\nBye<br \/>\nConnection to dmclient closed.<br \/>\n<\/code><br \/>\nRemember that widql\/wiapi\/etc&#8230; end up calling the native Documentum tools idql\/iapi\/etc&#8230; So, the containerized clients do work as expected.<\/p>\n<h2>Testing the container-clients container from its host<\/h2>\n<p>Since we are logged on the container&#8217;s host, we can pass commands to the container on the command-line, as show below:<br \/>\n<code><br \/>\ndmadmin@dmclient:~\/builds\/documentum\/clients$ docker exec -it container-clients bash -l widql dmtest02:container02:1489 -Udmadmin -Pdmadmin<br \/>\n...<br \/>\nConnected to OpenText Documentum Server running Release 16.4.0080.0129  Linux64.Oracle<br \/>\n1&gt; quit<br \/>\nBye<br \/>\nConnection to dmclient closed.<br \/>\n<\/code><br \/>\nNote that we use widql here because we don&#8217;t want to manually edit in advance the container-clients&#8217; dfc.properties file; widql will do it on-the-fly for us.<br \/>\nThe above command can be shortened by defining the following aliases:<br \/>\n<code><br \/>\nalias widqlc='docker exec -it container-clients bash -l widql'<br \/>\nalias wiapic='docker exec -it container-clients bash -l wiapi'<br \/>\nalias dmawkc=\"docker exec -it container-clients bash -l wdmawk\"<br \/>\nalias wdmqc='docker exec -it container-clients bash -l dmqdocbroker'<br \/>\n<\/code><br \/>\nTheir usage would be as simple as:<br \/>\n<code><br \/>\ndmadmin@dmclient:~\/builds\/documentum\/clients$ widqlc dmtest02:container02:1489 -Udmadmin -Pdmadmin<br \/>\ndmadmin@dmclient:~\/builds\/documentum\/clients$ wdmqc -t container02 -p 1489 -i<br \/>\ndmadmin@dmclient:~\/builds\/documentum\/clients$ dmawkc -v dmtest02:container02:1489 '{print}' ~\/.bash_profile<br \/>\n<\/code><br \/>\ncontainer-clients will do the connection to the repositories on the host&#8217;s behalf. As such, container-clients works as a proxy for the host. <\/p>\n<h2>Testing the container-clients container from a different host<\/h2>\n<p>In this scenario, we are logged on a machine different from the container&#8217;s host. Since we did not install ssh in the container, it is not possible to run something like &#8220;ssh dmadmin@container-clients widql dmtest02:container02:1489&#8221;, even supposing that the container is accessible through the network (we&#8217;d need to connect it to a macvlan network for example). But, if allowed to, we could access its host via ssh and ask it politely to send a command to the container, as examplified below:<br \/>\n<code><br \/>\ndmadmin@dmclient2:~$ ssh -t dmadmin@dmclient docker exec -it container-clients bash -l widql dmtest02:container02:1489 -Udmadmin -Pdmadmin<br \/>\n...<br \/>\nConnecting to Server using docbase dmtest02<br \/>\n[DM_SESSION_I_SESSION_START]info:  \"Session 0100c35080002b1a started for user dmadmin.\"<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\nConnected to OpenText Documentum Server running Release 16.4.0080.0129  Linux64.Oracle<br \/>\n1&gt; quit<br \/>\nBye<br \/>\nConnection to dmclient closed.<br \/>\n<\/code><br \/>\nwhich again could be simplified through a local alias:<br \/>\n<code><br \/>\nalias widqlc=\"ssh -t dmadmin@dmclient docker exec -it container-clients bash -l widql\"<br \/>\n<\/code><br \/>\nand invoked thusly:<br \/>\n<code><br \/>\ndmadmin@dmclient2:~$ widqlc dmtest02:container02:1489 -Udmadmin -Pdmadmin<br \/>\n...<br \/>\nConnected to OpenText Documentum Server running Release 16.4.0080.0129  Linux64.Oracle<br \/>\n1&gt; quit<br \/>\nBye<br \/>\nConnection to dmclient closed.<br \/>\n<\/code><\/p>\n<h2>Testing the container-clients container from another container<\/h2>\n<p>A similar scenario would be for a container (instead of a normal host) to use the container-clients to access a remote repository. In this case, the ssh client is needed on the source container and ssh server on the host dmclient (which generally has it already) and, supposing it has been installed, the same &#8220;ssh -t dmadmin@dmclient docker exec&#8230;&#8221; command as above, or an alias thereof, could be used.<br \/>\nOf course, if container-client has the whole ssh package installed and enabled, there is no need any more to go through its host machine to invoke the tools; a command like &#8220;ssh -t dmadmin@container-clients widql dmtest02:container02:1489&#8221; could be used directly or, again, a shortcut for it, from any node on the network, be it a container or a traditional host. The dmadmin account&#8217;s credentials are now needed but this is not a big deal.<\/p>\n<h2>Conclusion<\/h2>\n<p>The container-clients container allows to avoid having to install the Documentum clients over and over again on administrative machines, when that is possible at all. Having such a container available also avoids having to log on servers just to use their clients locally, again if that is possible at all, for less risks to pollute or corrupt the installation. We have used it only with containers so far but, network permitting, it could also be used to access remote, non containerized repositories just as easily and transparently. Although quite useful as-is, it could be made even more so by adding Documentum Administrator in it. This is shown in the next article here <a title=\"Documentum Administrator in a container\" href=\"https:\/\/www.dbi-services.com\/blog\/documentum-administrator-in-a-container\/\" target=\"_blank\" rel=\"noopener noreferrer\">Documentum Administrator in a container<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The aim here is to have a minimalist container with the usual Documentum clients idql, iapi, dmawk and dmqdocbroker. Documentum Administrator (DA) could also be a useful addition to our toolbox. We will show how to containerize it in a future article. A word of warning is in order here: the title&#8217;s catchy &#8220;small footprint&#8221; [&hellip;]<\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[],"type_dbi":[],"class_list":["post-12844","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>A Small Footprint Docker Container with Documentum command-line Tools - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A Small Footprint Docker Container with Documentum command-line Tools\" \/>\n<meta property=\"og:description\" content=\"The aim here is to have a minimalist container with the usual Documentum clients idql, iapi, dmawk and dmqdocbroker. Documentum Administrator (DA) could also be a useful addition to our toolbox. We will show how to containerize it in a future article. A word of warning is in order here: the title&#8217;s catchy &#8220;small footprint&#8221; [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-10-01T19:31:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-24T07:32:12+00:00\" \/>\n<meta name=\"author\" content=\"Middleware Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Middleware Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/\"},\"author\":{\"name\":\"Middleware Team\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\"},\"headline\":\"A Small Footprint Docker Container with Documentum command-line Tools\",\"datePublished\":\"2019-10-01T19:31:36+00:00\",\"dateModified\":\"2025-10-24T07:32:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/\"},\"wordCount\":1949,\"commentCount\":0,\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/\",\"name\":\"A Small Footprint Docker Container with Documentum command-line Tools - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2019-10-01T19:31:36+00:00\",\"dateModified\":\"2025-10-24T07:32:12+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A Small Footprint Docker Container with Documentum command-line Tools\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1\",\"name\":\"Middleware Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"caption\":\"Middleware Team\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/middleware-team\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"A Small Footprint Docker Container with Documentum command-line Tools - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/","og_locale":"en_US","og_type":"article","og_title":"A Small Footprint Docker Container with Documentum command-line Tools","og_description":"The aim here is to have a minimalist container with the usual Documentum clients idql, iapi, dmawk and dmqdocbroker. Documentum Administrator (DA) could also be a useful addition to our toolbox. We will show how to containerize it in a future article. A word of warning is in order here: the title&#8217;s catchy &#8220;small footprint&#8221; [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/","og_site_name":"dbi Blog","article_published_time":"2019-10-01T19:31:36+00:00","article_modified_time":"2025-10-24T07:32:12+00:00","author":"Middleware Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Middleware Team","Est. reading time":"19 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/"},"author":{"name":"Middleware Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"headline":"A Small Footprint Docker Container with Documentum command-line Tools","datePublished":"2019-10-01T19:31:36+00:00","dateModified":"2025-10-24T07:32:12+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/"},"wordCount":1949,"commentCount":0,"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/","url":"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/","name":"A Small Footprint Docker Container with Documentum command-line Tools - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2019-10-01T19:31:36+00:00","dateModified":"2025-10-24T07:32:12+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/a-small-footprint-container-with-idql-iapi-clients\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A Small Footprint Docker Container with Documentum command-line Tools"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1","name":"Middleware Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","caption":"Middleware Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/middleware-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12844","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=12844"}],"version-history":[{"count":1,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12844\/revisions"}],"predecessor-version":[{"id":41183,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/12844\/revisions\/41183"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=12844"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=12844"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=12844"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=12844"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}