sagantaf

なんでも自分の思ったこと、経験したことを書いて生きます。

TensorflowをGPUで使おうとして「CUBLAS_STATUS_NOT_INITIALIZED」というエラーが出たら

環境:

  • Docker上でubuntu16.04のコンテナを起動
  • GPU:TITAN V
  • nvidia-driver: 390
  • cuda: 9.1

という感じ

tensorflow-gpuをインストールした時に、下記のエラーが発生。

E tensorflow/stream_executor/cuda/cuda_blas.cc:366] failed to create cublas handle: CUBLAS_STATUS_NOT_INITIALIZED

W tensorflow/stream_executor/stream.cc:1901] attempting to perform BLAS operation using StreamExecutor without BLAS support

ググると「GPUのメモリが不足しているとか解放されていないからプロセスを落としたり再起動せよ」って書いてあるけど、解決しない時がある。

そんな時はメモリが原因ではなく、キャッシュやtensorflowの設定に問題がある。

以下を実施することでエラーは発生しなくなり問題なくインストールできた。

キャッシュファイルの削除

$ sudo rm -rf ~/.nv/

tensorflowの設定変更

$ python
>>> import tensorflow as tf  
>>> from keras.backend.tensorflow_backend import set_session  
>>> config = tf.ConfigProto()  
>>> config.gpu_options.allow_growth = True  
>>> config.log_device_placement = True
>>> sess = tf.Session(config=config)  
>>> set_session(sess) 

「config.gpu_options.allow_growth = True」の設定で、GPUのメモリを状況に応じて変更してくれるようになる。

「set_session(sess) 」で修正を反映できる。

アクションバイアス〜目標を持って仕事を進める人間になるには

アクションバイアスという本を読んで、目標を持って仕事を進めていくための方法を自分なりに理解して解釈したので、その内容を残す。

アクション・バイアス: 自分を変え、組織を動かすためになすべきこと

アクション・バイアス: 自分を変え、組織を動かすためになすべきこと


本書は、「目的意識を伴う行動をとれる人間になるにはどうするか」「どうすることで、目的を常に意識して行動することができるか」について書いてある。

簡単に言うと、
 目標に対するエネルギー・やる気を高め、個人の強い決意、強固な意思に集中することで、気を散らすものを追い払い、問題を克服し、挫折してもやり抜き、目標を達成することができる
という内容




目次

エネルギーを高めるには

目標を明確にする

 目標は、達成する自信があり、明確であり、意欲的であることで意味を持つ。
 そんな目標を定めるために以下の項目を確認する。

 ・目標はどのような要素により構成されているのか、それを達成するためにはどのような障害を乗り越える必要があるか
 ・その目標を追求することが、自分にとって価値のあることだと確信しているか、またそれが組織の利益にもなると同時に確信しているか
 ・圧倒されて最初から何をしたら良いかわからないような目標になっていないか。達成可能だと感じられるか。

 達成したいと思う、自分の感情を揺さぶるような目標を見つける。最初は漠然としていても、よく考え抜き、疑念や不安を解消させ、明確に頭の中にイメージを描く。そうすることで頭でも心でも目標を達成できると確信できる。
 また、事前に目標達成の状態、中止とする状態を明確に定めておき、このルールに従うことも、猪突猛進にならないために必要になる。

感情をコントロールする

 考えや感情に圧倒され、抑え込むと、不安や怒りが、やがて不満やあきらめに変わってしまう。
 前向きな態度をとるための方法として、
 ・内面の緊張や辛い気持ちをうまく処理する方法を知る(人に話したり全く別のことをやったり様々)
 ・定期的にエネルギーを補充する(趣味に興じたり、特別な場所へ行ったり)



目標に集中するためには

頭の中に自分の意図を描く

 目標や意図や具体的な行動イメージを頭の中に鮮やかに描いておくことで、障害にぶつかった時や横道に逸れそうな時に、描いたイメージが心の支えとなる。
 また、集中を阻害する主な要因は、新しいことをする、既存のものを変更する、障害にぶつかる、やることが多すぎて考える時間がないなど。これらに対する対処(障害にぶつかったらどうするか、気が逸れたらどうするか、など)を自問する。

自分の意図に個人的なコミットメントをする(決意する)

 自分自身が最終的に結果を左右するということを認識する個人的なコミットメント=決意をすることで集中力が高まる。(責任感を高める)
 ただし「誰が自分に何を期待しているか、評価されるだろうか、自分にはどんな利益があるのか、合理的か」と行った理性的な分析による決意だけでは、今よりも良い仕事や他のアイデアが出てきたときに簡単にぐらつき、横道に逸れてしまう。
 仕事についての理性的な分析と、感情的な願望が一致した時に決意が強固なものになる。
 定期的に時間をとって内省し、自分は本当にそれを望んでいるかを自問する必要がある。自問の内容として、「その目標に心踊るか」「逆境に立たされても持続できるか」「自分の価値観や信念に合致するか」「目標が達成できなかったらどう感じるか」「達成したらどう感じるか」「どのような障害に直面するか。どう対処できるか。」「どんな感情、イメージが自分の前向きな行動を促すか」など。

目標から気を逸らさせる感情に対処する

 気を逸らさせるような対象を、魅力がないものへとイメージで変えてみる。
 疑念やイライラなどの感情を認め、周りに話す。
 ネガティブな感情をポジティブに捉える(ユーモアで包み込んだり笑い話にしたり、プライドを掻き立てたり)


モチベーションではなく意志力

今まで書いたプロセスを経ることによって、モチベーションを高めるというレベルではなく、強固な意志力を持って目的に邁進できるようになる。
モチベーションは、何かに関与したいと願ったり、何らかの機会に惹かれたり、何らかの行動をとりたい気持ちになるといった状態であり、環境の変化や内面の嗜好の変化に影響されやすく、不安的なもの。
意志力は、まず目的や使命があり、それに対して考え抜き、疑念や不安を解決しているため、疑いの余地なく突き進むことができるもの。また障害にぶつかっても克服するための方法を考え抜き、失敗するという選択肢が出てこない。


行動を阻む罠

上記を実現できたとしても陥ってしまう行動できなくなる罠が3つある。

圧倒される要求

日常の仕事に圧倒されることで、自分の目標を振り返り、何が重要かを自問できず、何も達成できない状態に陥ってしまう。
そうならないように仕事の要求をコントロールする方法として以下を実施する。

・自分個人のアジェンダを作成する
 仕事上で成し遂げたいと思うこととその方法について、アジェンダとして明確に考えをまとめる。そしてそのアジェンダに沿って仕事を進めることで、毎日の仕事が長期的な目標に向かっていると実感し、意欲を掻き立てることができる。意志力の強化につながる。

・全てをやろうとしない
 全てをやろうとすると二兎を追う者は一兎をも得ずになる。実施する仕事を吟味して取捨選択する。また選択した仕事について優先順位をつけてから手を付ける。

・要求に働きかけ、自分への期待を管理する
 他人の期待や要望全てに答えようとすると自分のアジェンダを追求する時間がなくなり、上記と同じく二兎を得ず状態になる。アジェンダの主要な利害関係者に注意を集中させるべき。

・人と接する時間を決めておく
 人とのやりとりは、時間がかかるだけではなく、頭を何度も切り替えることで意志力が削がれる。一日のうち接する時間の上限を決めておく(打ち合わせ時間や依頼対応など)。

耐えられない制約

規則や規制、制約があるために自主的に行動をとる余地がないと信じ込み、意欲を失ってしまう。
そうならないように自分を制約から解き放つための戦略として以下を実施する。

・制約の地図を作成する
 時間や意欲を奪っている規則規制や、前進することを阻む壁となっている制約などを言語化することで、対処法を具体的にイメージできるようになる。

トレードオフを受け入れる
 「なくてはならないこと」と「あればいいと思うこと」を峻別し、前者に対しての制約と闘うことに注力する。全てに対応できないことを理解し、「あればいいと思うこと」を捨てる必要に迫られた時には捨てる。

・規則を選んで破る
 時には許可を得るよりも後で謝る方が良い。自分の目標達成のために邪魔になるならば、規則を破るか回避する方法を考えるか、規則自体を変える。
 規則を変えるには、規則がある理由を考え、無くしたり変えたらどうなるのかをイメージした上で、周囲の人を巻き込んで議論する。

模索しない選択肢

仕事の要求と制約に目を奪われ、視覚狭窄に陥り、目の前のニーズや要求に専念してしまう。 そういったことに陥らないようにするために以下を実施する。

・選択ができることに気づく
 選択肢を持つことは選択することよりも重要。自らの意思で選択し、行動していることになり、意志力の向上につながるため。  選択肢は常に明快であるわけではないため、仕事上で「できない」と自分が認識していることは何か、を自問し、「一体誰が、何がそれを阻害しているか、それを行なったらどうなるか」をイメージする。

・選択肢の幅を広げる
 自分の目標を達成するためには何が必要になるのか、どんな方法があるのか、1つしか方法はないのか、を自問する。複数の選択肢を持っておくことで、必要に迫られた時にいつでも切り替えることができる。
 また、他の人に相談したり、自分の気持ちを上司と率直に話し合うことで、他人の意見や見方を知り、選択肢の幅を広げることもできる。

・個人の知識と能力を高める
 絶えず自らの知識を積み、能力を広げ、深掘りする。
 自分自身の仕事のみに注力し、広げること(他人の関心ごとや姿勢を理解することも含む)をしないでいると、視野が狭くなり他人への感情移入ができない。つまり自分がやりたいことを他人に提示、説得することがうまくできない。

pandas〜欠損値扱いの数値をNaNに変換する

-1や999など欠損値として格納されているデータをpandasのreplaceを使ってNaNに変換する方法を書く。


サンプルデータフレームの作成

まずはサンプルのために簡単なデータフレームを作成する。
欠損値は、-1, 999, 1000とする。

import pandas as pd

df = pd.DataFrame([[1,2,-1,4,5],[1000,5,6,999,8]],['a','b'])

dfは以下のようになる。

0 1 2 3 4
a 1 2 -1 4 5
b 1000 5 6 999 8



欠損値をNaNに変換する

pandasのreplaceメソッドを利用して変換できる。

df2 = df.replace([-1, 999, 1000], np.nan)

df2は以下のようになる。

0 1 2 3 4
a 1 2 NaN 4 5
b NaN 5 6 NaN 8

文法は
 df.replace(変換したい対象, 変換後のデータ)
と書き、変換したい対象はリストを指定することも可能。

他に例えば0に統一したい場合は、

df2 = df.replace([-1, 999, 1000], 0)

とするだけ。



元のデータフレームを変更してしまう

先ほどのようにdf2をわざわざ作成せずに、元のdfを書き換えてしまうにはオプションとしてreplaceをつけるだけ。

df.replace([-1, 999, 1000], np.nan, inplace=True)

これでdfが直接変換される。



pandas〜データフレームをpickleファイルとして保存し効率的に開発する

pandasでデータを読み込んで色々手を加えたデータフレームをpickleファイルとして保存(ダンプ)する方法を書く。

毎回 jupyter-notebookを開いたときに最初から実行せずに、保存しておいた編集済みのpickleファイルを読み込むことで、かなりの時短になる。



サンプルデータフレームの作成

まずはサンプルのために簡単なデータフレームを作成する。

import pandas as pd
import joblib

df = pd.DataFrame([[1,2,3],[4,5,6]],['a','b'])

dfは以下のようになる。

0 1 2
a 1 2 3
b 4 5 6



データフレームの保存

joblib.dump(df, './sample.pkl')

joblib.dumpという関数を利用して、データフレームをファイルとして保存できる。 上記の場合、.pyファイルを実行、もしくはjupyter-notebookを起動したカレントディレクトリにファイルが保存される。



データフレームの読み込み

df2 = joblib.load('./sample.pkl')

df == df2

joblib.loadという関数を使うことで、ファイルの中身をデータフレームに格納できる。 結果は以下のように表示されるはず。

0 1 2
a True True True
b True True True



Rancher入門〜インストールと基本的な使い方


コンテナ管理のためのGUIであるRancher バージョン2 の導入方法と使い方をまとめておく。


目次

はじめに

Docker自体のインストールは以下に記載。
sagantaf.hatenablog.com
Rancherの詳細は以下を参照(公式ページ、英文)
Overview | Rancher Labs


今回検証した環境は、  

  • Ubuntu 16.04  
  • Docker 18.06.1-ce

    RancherはDocker for Mac と Docker for Windows には未対応らしい。

    Rancher Management Server を起動

    以下のコマンドを実行し、Management Server(以下、managementマシン)を起動する。

    sudo docker run -d --restart=unless-stopped --name=rancher_master  -p 8001:8080 rancher/server


    オプションの詳細は以下:
     -d →コンテナをバックグラウンドで実行する
     --restart=unless-stopped →明示的に停止したとき以外には再起動する
     --name=’NAME' →コンテナにNAMEという名前をつける
     -p 8001:8080 →8001などホストポートを指定する(8080はコンテナのポート。8080じゃないとrancherに繋げられない)

    実行後は、ブラウザで

     http://<コマンドを実行したマシンのIPアドレス>:8001

    にアクセスすることでGUIページを開ける。

    ただし、アクセスできるようになるまで2〜3分かかる。

    f:id:sagantaf:20181230223027p:plain
    Rancher起動時の画面


    上記のように最初の画面が現れたら、「Got it」を押して、上のバーに出ている「Add a host」へ。

    ホストマシンをRancherの管理対象として追加

    最初にmanagementマシンのURLを設定する画面が出る。ここで指定するURLは、追加したいホストマシンからアクセスできるURLである必要がある。localhostなどになっている場合はアクセスできないのでIPアドレスに変更しておく。

    f:id:sagantaf:20181230233459p:plain
    URL設定画面


    「Save」して次のページに行くと、AWSインスタンスやAzureのインスタンスなどを選択できる。
    ここでは「Custom」のまま、4 に追加したいIPアドレスを入力する。

    f:id:sagantaf:20181230225454p:plain
    Add Hostのページ

    5 に書いてある自動で作成されたコマンドをコピーして、追加したいホストマシン上で実行する。
    実行した結果、ホストマシンのコンソールに「INFO: Launched Rancher Agent: XXXXXX」の文言が出力されたらOK。

    少し時間を置いた後に、ホスト画面にホストが追加されていればOK。

    いつまで経ってもホストが追加されない場合はエラーが出ている可能性がある。 ここではDNS設定ができておらず、Managementマシンと通信できていない場合の対処方法を記す。

    追加したいホストのDocker設定を追加する

    追加したいホストにログインし、dockerの設定ファイルを編集する。

    sudo vim /etc/docker/daemon.json

    以下の文言を追加して保存する。

    {
        "dns": ["8.8.8.8", "8.8.4.4"]
    }
    

    rancher-agentとdocker自体を再起動

    docker stop rancher-agent
    sudo systemctl restart docker
    docker start rancher-agent

    これを実行した後にRancherのGUIでホストが追加されていることを確認する。

    RancherGUIへのアクセス制限を設定する

    無事、ホストが追加されたら、いよいよコンテナを追加、、、の前に簡単なセキュリティ対策をしておく。

    Rancherは最初に起動したままでは、誰でもURLにアクセスすればGUIを触れる状態になっている。
    ここではアクセス制限として、管理者のみがアクセスできるようにするために、ユーザとパスワードを設定する。

    一番上のバーから ADMIN > Access Control と移動すると以下の画面になる。

    f:id:sagantaf:20181230231626p:plain
    Access Controlのページ

    LOCALを選択して、必要な情報を入力したら、「Enable Auth」を押して有効化する。

    設定できたかを確認するために、一度ログアウトする。
    以下の認証画面が表示されたらOK。
    (ついでに日本語に変えておいた)

    f:id:sagantaf:20181230232025p:plain:w200
    ログイン画面

    カタログからコンテナを追加する

    ここではWordPressをお試しで構築する。
    上のバーのスタックから、「カタログを参照」へ移動する。

    f:id:sagantaf:20181231084018p:plain:w300
    スタック初期画面

    検索窓でwordpressと検索して「詳細を見る」へ。

    f:id:sagantaf:20181231084305p:plain
    カタログ検索画面

    詳細画面ではとりあえずデフォルトの値のまま「起動」を選択する。
    起動した後は、2〜3分で左から右の状態になる。

    f:id:sagantaf:20181231084828p:plain:w220   f:id:sagantaf:20181231085122p:plain:w220
    起動後の状態

    全てActive状態になったら、ブラウザから
      http://<追加したホストのIPアドレス>:80
    にアクセスすることでWordPressのテンプレート画面が表示される。

    例)http://192.168.123.1:80

  • Docker入門〜dockerとdocker composeをubuntuにインストールするためのシェル

    タイトルの通りdockerとdocker-composeをubuntu16.04環境に一気にインストールしてしまうためのシェルを作成しました。

    #!/bin/sh
    
    # まずは必要なパッケージをインストール
    sudo apt update
    sudo apt install -y \
        apt-transport-https \
        ca-certificates \
        curl \
        software-properties-common
    
    # Dockerのリポジトリの追加
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository \
       "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
       $(lsb_release -cs) \
       stable”
    
    # Dockerのインストール
    sudo apt update
    sudo apt install -y docker-ce
    
    # docker-composeのインストール
    sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
    
    # docker-composeの実行権限を追加
    sudo chmod +x /usr/local/bin/docker-compose
    
    # 最後にバージョンを確認
    docker  --version
    docker-compose --version

    実行結果の出力として、dockerとdocker-composeのバージョンがそれぞれ出力されたら成功です。

    シェルファイルにせず、コマンドを1行1行実行していっても大丈夫です!

    Docker入門〜基本的な使い方のまとめ

    目次



    はじめに

    Dockerの入門レベルで必要な基本的な使い方をまとめています。
    また、Dockerfileの書き方やライフサイクルについても最後の方にまとめています。


    Dockerイメージの操作

    イメージの取得

    user@pc:~$ sudo docker pull nvidia/cuda
    Using default tag: latest
    latest: Pulling from nvidia/cuda
    473ede7ed136: Pull complete
    c46b5fa4d940: Pull complete
    93ae3df89c92: Pull complete
    6b1eed27cade: Pull complete
    cb5511f09cc0: Pull complete
    4173c1e5c714: Pull complete
    221b05733c9e: Pull complete
    564d11654322: Pull complete
    Digest: sha256:2c7a92b1ca05a770addc715ed247c8235f1d9e96b8b032feaa426cd8f4c7535e
    Status: Downloaded newer image for nvidia/cuda:latest



    イメージの一覧表示

    hoge@PC:~$ docker images
    REPOSITORY                                                             TAG                            IMAGE ID            CREATED             SIZE
    nvidia/cuda                                                            latest                         1cc6f1613121        6 weeks ago         2.24GB

     -hでヘルプとして使い方を確認できる

    hoge@PC:~$ docker images -h
    Flag shorthand -h has been deprecated, please use --help
    
    Usage:    docker images [OPTIONS] [REPOSITORY[:TAG]]
    
    List images
    
    Options:
      -a, --all             Show all images (default hides intermediate images)
          --digests         Show digests
      -f, --filter filter   Filter output based on conditions provided
          --format string   Pretty-print images using a Go template
          --no-trunc        Don't truncate output
      -q, --quiet           Only show numeric IDs



    イメージの詳細表示

    docker inspect [IMAGE ID]
    もしくは
    docker inspect [REPOSITORY:TAG]

    hoge@PC:~$ docker inspect 1cc6f1613121
    hoge@PC:~$ docker inspect nvidia/cuda:latest

    docker inspect --format=“{{ .[詳細表示の中の項目名]}}” [イメージ名]

    infra@P001:~$ sudo docker inspect --format='{{.Created}}' nvidia/cuda:latest
    2018-11-13T00:14:31.409404412Z
    infra@P001:~$ sudo docker inspect --format='{{.ID}}' nvidia/cuda:latest
    sha256:1cc6f16131211806e1bebfc07a11b5a2f59d0bee5529f8743bc6211cc6658e0f



    イメージのタグ設定

    infra@P001:~$ sudo docker tag nvidia/cuda:latest cuda-test:0.2
    infra@P001:~$ sudo docker images
    REPOSITORY                                                             TAG                            IMAGE ID            CREATED             SIZE
    cuda-test                                                              0.2                            1cc6f1613121        6 weeks ago         2.24GB
    nvidia/cuda                                                            latest                         1cc6f1613121        6 weeks ago         2.24GB



    イメージの削除

    infra@P001:~$ sudo docker rmi nvidia/cuda:latest
    Untagged: nvidia/cuda:latest
    Untagged: nvidia/cuda@sha256:2c7a92b1ca05a770addc715ed247c8235f1d9e96b8b032feaa426cd8f4c7535e
    infra@P001:~$ sudo docker images
    REPOSITORY                                                             TAG                            IMAGE ID            CREATED             SIZE
    cuda-test                                                              0.2                            1cc6f1613121        6 weeks ago         2.24GB

    タグ設定したcuda-testは残る



    イメージの作成(Dockerfileから)

    docker build -t test ./(Dockerfileが存在するディレクトリ)

    書き方は後述




    Dockerコンテナの生成、起動、停止


    コンテナの状態確認

    docker ps
    docker ps -a


    コンテナの生成

    docker create [IMAGE ID]

    infra@P001:~$ docker create cuda-test:0.2
    f28e686dc171ddeb493928f0a118c0d1c64fce58a14aa330d70c9a84915b39ad
    infra@P001:~$ docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
    f28e686dc171        cuda-test:0.2       "/bin/bash"              7 seconds ago       Created                                        kind_khorana

    ただ生成するだけで、実行はしない


    コンテナの生成と起動

    docker run -it --name=[コンテナ名] [コンテナイメージ名] /bin/bash

    docker run -it --name="test-login" ubuntu:16.04 /bin/bash

    シェルを実行してコンテナの環境にログインできる

    -i : コンテナの標準入出力を有効にする
    -t:擬似ターミナルを有効にする(ttyの確保)
    --name:コンテナに好きな名前をつける


    コンテナの削除

    docker rm kind_khorana

    コンテナの全消しする場合は以下

    docker rm $(docker ps -q -a)


    停止したコンテナの起動

    docker start hoge


    稼働しているコンテナの停止

    docker stop hoge


    バックグラウンド実行
    コンテナは、サーバ起動やオンライン処理など一つの処理を実行するために生成されるのが一般的
    →バックグラウンドで動かす(シェルでのログインはしない)
    →バックグラウンド実行は docker run に -d オプションをつけるだけ

    docker run ubuntu:16.04 hoge.sh

    hoge.shを実行するためのコンテナということになる


    ネットワーク関連の設定をしてコンテナ実行

    root@node1:~# docker run -p 8080:80 httpd


    -p:ホストのポートとコンテナのポートのマッピング
    --expose=:指定したレンジのポートを割り当てる
    --dns=XXX.XXX.XXX.XXX:DNSサーバを設定
    --add-host=<ホスト名>:<IPアドレス>:コンテナのhostsにホスト名とIPアドレスを指定
    --hostname:コンテナ自身のホスト名を指定
    --link=<コンテナ名:エイリアス>:他のコンテナからアクセスするときの名前を指定
    --net=host:コンテナがホストOSのネットワークを使う → ホストOSに接続できる端末はコンテナにもアクセスできる


    共有ディレクトリを指定
    ホストOSとコンテナでディレクトリを共有するための設定は-vオプションをつける
     -v [ホストのディレクトリ]:[コンテナのディレクトリ]

    docker run -v /home/testprod/:/home/docker_test/ ubuntu


    コンテナの稼働状況を見る

    docker stats [コンテナ名]

    稼働しているDockerコンテナの操作


    稼働しているコンテナへの接続

    docker attach [コンテナ名]


    コンテナ内のプロセスのみ終了
    ctl + q を実行すると、コンテナは終了させずに、コンテナ内で動くプロセスのみ終了させることができる(例えば/bin/bashのみ)
    bashなどからexitしてしまうとコンテナごと終了してしまう


    稼働しているコンテナでプロセスの実行 上記などで終了させたプロセスをもう一度実行したいときなどに使う
    実行中のコンテナにログインする時などに使う

    docker exec -it [コンテナ識別子] /bin/bash


    稼働しているコンテナの状況をtopで確認できる

    docker top [コンテナ識別子]


    コンテナ名を変更する

    docker rename [元の名前] [変更したい名前]


    コンテナ差分を確認する コンテナイメージで生成されたときからの環境の差分を表示できる

    docker diff [コンテナ識別子]

    このdiffを監視しておいて、検知したらイメージを作成する、とすれば変更に対して自動でイメージ作成することができる


    生成したコンテナをイメージとして保存する

    docker commit [コンテナ識別子] [イメージ名:タグ]

    -aで作成者、-mでメッセージを残すことができる


    イメージのレイヤー構造を保った形でのイメージ保存&その読み込み

    docker save [保持ファイル名] [イメージ名]

    読み込みはloadコマンドになる

    docker load < [保持ファイル名]


    レイヤー構造は保たずにイメージ保存&その読み込み

    docker export [コンテナ識別子] > [保持ファイル名]

    その読み込みはimportコマンドになる

    cat [保持ファイル名] | docker import - [イメージ名:タグ]



    Dockerfileについて

    Dockerfileの書き方

    • FROMには構築時の元になるイメージを指定する
    • RUNにはコンテナ環境として実行しておきたいコマンドを指定する(インストールや諸処の設定)
    • CMDにはコンテナ実行時に実行したいコマンドを指定する(ただしdocker runに引数があった場合は、CMDのコマンドは実行されない)
    • ENTRYPOINTにはdocker run時に実行されるコマンドを指定する
    • COPYはファイルコピーの元ファイルと先ディレクトリを指定する
    • ADDはCOPYと似ているが圧縮ファイルなどを全て展開した形でコピーする

    CMDとENTRYPOINTについて
    CMDとENTRYPOINT の両方の記載がある場合は、CMD が ENTRYPOINT に指定したコマンドのオプションとなる
    また、コンテナ実行時にオプションがあれば、ENTRYPOINT の引数となる
    docker inspectコマンド結果のCmdの部分を確認することで、イメージファイルにて何が実行されるかを事前に把握することが可能


    参考ページ

    Dockerfile リファレンス — Docker-docs-ja 17.06.Beta ドキュメント

    Dockerfile を書くベスト・プラクティス — Docker-docs-ja 17.06.Beta ドキュメント

    ライフサイクル

    Dockerfileを書く

     vim Dockerfile


    イメージをビルドする

     docker build


    イメージを確認する

     docker images


    コンテナをランする

     docker run


    スタートする

     docker start


    コンテナの状態を確認する

     docker ps
     docker ps -a


    ストップする

     docker stop


    コンテナ削除する

     docker rm


    イメージ削除する

     docker rmi