docker
docker-compose
TensorFlow
Tensorboard

TensorFlowとTensorBoardをいい感じに起動できるdocker-composeを作ってみました。

docker素人が、記事をつまみつつ、お酒を飲みながら書きました。
稚拙ですがよろしくお願いいたします。

前提

OSバージョン macOS High Sierra 10.13.4

Dockerをインストールしてあること
Docker バージョン Version 18.03.1-ce-mac65 (24312)
使用している TensorFlowイメージ tensorflow/tensorflow:latest-py3

本文

docker-compose の中身はこんな感じです。

docker-compose.yml
# /Users/user/Documents/workspace/working_dir は
# あなたの任意の「ホスト」のworkspaceのディレクトリのパスを入れてください

tensorflow:
  image: tensorflow/tensorflow:latest-py3
  volumes:
    - /Users/user/Documents/workspace/working_dir:/workdir
  working_dir: '/workdir'
  ports:
    - "8888:8888"
  environment:
    PASSWORD: password

tensorboard:
  build: tensorboard
  volumes:
    - /Users/user/Documents/workspace/working_dir/logs:/logs
  working_dir: '/logs'
  ports:
    - "6006:6006"
  environment:
    reload_interval: 2
    log_dir: /logs
ディレクトリ構成

working_dir
  |- ipynb とか
  |- docker-compose.yml
  |- tensorboard
     |- Dockerfile

tensorboard の Dockerfileは、 雑に TensorBoard を起動する Docker イメージの作り方 を参考にしました。ありがとうございます。是非併せてご覧下さい。

ファイルを配置したら、working_dir内で次のコマンドを実行することでTensorFlowTensorBoardが起動されます。

  • TensorFlow: port 8888
  • TensorBoard : port 6006
docker-compose up -d

停止する時

docker-compose stop

environment passwordについて

tensorflow/tensorflow:latest-py3イメージで起動される、jupyter_notebookは初回アクセス時にpasswordかtokenを求められるようになっています。 tokenはdocker runした時にconsoleに表示されるのですが、起動毎に毎回変わってしまうのと、docker-compose up -dだと表示されないので都合が悪いです。

tensorflow/tensorflow:latest-py3では、jupyter_notebook_config.pyPASSWORD環境変数で初期passwordを設定できるようになっている記述がありますので、それを利用し、任意のpasswordを指定することで問題を解決しています。

~/.jupyter/jupyter_notebook_config.py
import os
from IPython.lib import passwd

c = c  # pylint:disable=undefined-variable
c.NotebookApp.ip = '*'
c.NotebookApp.port = int(os.getenv('PORT', 8888))
c.NotebookApp.open_browser = False

# sets a password if PASSWORD is set in the environment
if 'PASSWORD' in os.environ:
  password = os.environ['PASSWORD']
  if password:
    c.NotebookApp.password = passwd(password)
  else:
    c.NotebookApp.password = ''
    c.NotebookApp.token = ''
  del os.environ['PASSWORD']