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イメージを作成します。
curl
でtabcmd
を取得し、展開します。
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コンテナ上にマウントします。
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、ログアウトを実施します。
#!/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コンテナ上でスクリプトを実行します。
#!/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を使うと環境間の差異が原因での実行エラーを防げます。
学習コストは高いですが、作業の標準化にはうってつけだと思います。