Dockerでtabcmd実行環境を作る方法


Tableau Serverをコマンドラインから操作できるtabcmdですが、Javaのバージョンが8以下でないとエラーが起るようです。(実際、Java12がインストールされた環境でtabcmdを実行するとエラーが起こります)
https://community.tableau.com/docs/DOC-22179

そこで、Openjdk8をベースイメージにして、Dockerでtabcmdを実行できる環境を構築します。

今回はDockerコンテナを起動し、docker execでTableau Serverへのログイン、Publish、ログアウトをやってみます。

環境

  • mac Mojave 10.14.5
  • Tableau Desktop 2019.2.1
  • Tableau Server 2019.2.1
  • tabcmd-2019-2-1

ディレクトリ構成

以下のディレクトリ構成にします。

tabcmd/
 ├ docker-compose.yml
 ├ Dockerfile
 ├ sh
   └ publish.sh
 └ start.sh

作成ファイル

Dockerfile

Openjdk8をベースイメージに、Dockerイメージを作成します。
curltabcmdを取得し、展開します。

FROM openjdk:8

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update
RUN apt-get install -y sudo curl gdebi
# download tabcmd
RUN curl -L -O https://downloads.tableau.com/esdalt/2019.2.1/tableau-tabcmd-2019-2-1_all.deb
# extract deb
RUN gdebi -n tableau-tabcmd-2019-2-1_all.deb

docker-compose.yml

ローカルのsh/publish.shをDockerコンテナ上にマウントします。

docker-compose.yml
version: '3'

services:
  tabcmd:
    build: ./
    tty: true
    container_name: tabcmd
    image: tabcmd
    volumes:
    - ./sh:/var

sh/publish.sh

docker-compose.ymlで記載されている通り、Dockerコンテナ上にマウントされます。
引数を受け取り、Tableau Serverにログイン、Publish、ログアウトを実施します。

publish.sh
#!/bin/bash
# set env path of tabcmd
source /etc/profile.d/tabcmd.sh

# login
echo "starting login."
tabcmd --accepteula login -s $1 --username $2 --no-certcheck --password $3
echo "completed login."

# Publish
echo "starting publish."
tabcmd publish $4 -o $5 -r $6 --db-username $7 --db-password $8 --save-db-password --save-oauth --no-certcheck
echo "completed publish."

# logout
echo "starting log out."
tabcmd --accepteula logout -s $1 --no-certcheck
echo "completed log out."

start.sh

パラメータを設定し、ローカルで実行します。
ローカルのPublish対象のtwbファイルをDockerコンテナ上にコピーし、docker execによってDockerコンテナ上でスクリプトを実行します。

start.sh
#!/bin/bash

# set param
TABLEAU_SERVER_URL=
TABLEAU_SERVER_LOGIN_ID=
TABLEAU_SERVER_LOGIN_PASS=
# tableau twb in local
TWB_PATH_LOCAL=
# in docker (ex. var/test.twb)
TWB_PATH_DOCKER=
OVERWRITE_WB_NAME=
PJ_NAME=
DB_USERNAME=
DB_PASSWPRD=

# copy from local to docker
docker cp $TWB_PATH_LOCAL tabcmd:$TWB_PATH_DOCKER
# exec publish on docker
docker exec tabcmd bash -c "source var/publish.sh $TABLEAU_SERVER_URL $TABLEAU_SERVER_LOGIN_ID $TABLEAU_SERVER_LOGIN_PASS $TWB_PATH_DOCKER $OVERWRITE_WB_NAME $PJ_NAME $DB_USERNAME $DB_PASSWPRD"

環境構築

上記のファイルを作成後、ローカルでdocker-compose.ymlと同一ディレクトリで以下を実行します。

docker-compose up -d

実行完了後、以下を実行してコンテナが起動していることを確認します。

 docker ps

結果:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
823a47830565        tabcmd              "bash"              About an hour ago   Up About an hour                        tabcmd

スクリプト実行

ローカルでstart.shと同一ディレクトリで以下を実行します。

sh start.sh

これでPublish完了です。

まとめ

Dockerを使うと環境間の差異が原因での実行エラーを防げます。
学習コストは高いですが、作業の標準化にはうってつけだと思います。