Edited at

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

More than 1 year has passed since last update.

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']