2016-09-04 10 views
0

ドッカーの周りに私の方法を学ぶように私に同行してください。私は使用していますv1.11.1Dockerfile、VOLUMEでデータを保持

私はDockerfileを作成していて、コンテナのフォルダを永続化するように指定したいと考えています。これは、ユーザ(コンテナを実行しているコンピュータ)ごとに永続化する必要があります。

VOLUME /path/to/dir/to/persist 

十分だろうが、私はdocker run -t -i myimage:latest bashと私のコンテナを起動し、手動で、その後exitにファイルを追加するとき、私は再び私のファイルを見つけることができることを期待:私はもともと含めすることを考えました。しかし、イメージをもう一度実行すると(上記のように)、追加されたファイルはもう存在しません。

私の周り読んだが、答えはボリュームの使用に関しては古く、またはである、私はむしろしないだろう事を示唆どちらかのように見える

  • 私は-vを使用したくありませんそれは私が間違ってやっていることは何ですか?

私はむしろ、ボリューム・コンテナは、(私の1つの小さなフォルダのやり過ぎのように思える)することはないだろうコマンド

  • を実行しますかどんな助けでも大歓迎です。

    乾杯。

    更新:docker run -v name:/path/to/persist -t -i myimage:latest bashしかしVOLUME name:/path/to/persistは動作しません含まれていDockerfile付の建物:私は名前のボリュームすなわちを使用してデータを永続化することができます。

  • 答えて

    1

    「ドッカーの実行」を行うたびに、新しいコンテナを作成していることはあまりありません。新しいコンテナごとに新しいボリュームが作成されます。

    データは永続化されていますが、書き込んだコンテナからデータを読み取っていません。今回

    $ docker run -ti myimage echo hello world 
    $ docker run -ti myimage echo hello world 
    

    それを実行して、ボリュームを見てみましょう

    $ docker build . -t myimage 
    Sending build context to Docker daemon 2.048 kB 
    Step 1 : FROM ubuntu 
    ---> bd3d4369aebc 
    Step 2 : VOLUME /data 
    ---> Running in db84d80841de 
    ---> 7c94335543b8 
    

    通常通りに建てられ

    FROM ubuntu 
    VOLUME /data 
    

    Dockerfile問題に

    サンプルを説明するため

    $ docker volume ls 
    DRIVER    VOLUME NAME 
    local    078820609d31f814cd5704cf419c3f579af30672411c476c4972a4aad3a3916c 
    local    cad0604d02467a02f2148a77992b1429bb655dba8137351d392b77a25f30192b 
    

    「docker rm」コマンドには、コンテナに関連付けられたボリュームをクリーンアップする特別な「-v」オプションがあります。

    $ docker rm -v $(docker ps -qa) 
    

    同じドッキングウィンドウの画像を使用してデータコンテナ

    を使用する方法、前の例に建てられたその唯一の目的は、ボリューム

    $ docker create --name mydata myimage 
    

    打ち上げ別だ介してデータを永続化するためにあるコンテナを作成"/ data"ボリュームにデータを保存するコンテナ

    $ docker run -it --rm --volumes-from mydata myimage bash 
    [email protected]:/# echo hello world > /data/helloworld.txt 
    [email protected]:/# exit 
    

    起動

    $ docker run -it --rm --volumes-from mydata myimage cat /data/helloworld.txt 
    hello world 
    

    クリーンアップデータを取得する第二の容器は、単に容器を除去し、そのボリュームがクリーンアップされていることを確認するための「-v」オプションを指定します。

    $ docker rm -v mydata 
    

    注:

    • 「ボリューム-から」パラメータは、すべてのデータが「MYDATA」コンテナ
    • コンテナを実行している「RM」オプションに関連した基本的なボリュームに保存されることを意味それらが自動的に削除されることを保証し、一時的なコンテナに役立ちます。
    +0

    ありがとうございました。しかし、なぜ私はDockerfileからではなく、コマンドラインから正常に名前付きボリュームを使うことができますか?それは私が混乱していることです(私の更新を見てください)。公式文書では、もはやボリュームコンテナを使用しないようにして、さらに混乱させるべきだと述べています。 –

    +0

    @ D.Mill名前付きボリュームは、データ管理のもう一つのオプションです。これを新しいストレージプラグインと組み合わせると最も効果的です。ここでは、Dockerfileの中で宣言されたボリュームをサポートし、それが期待どおりに動作していなかった理由を説明する、あなたの質問に集中していました。結論として、Dockerファイルは実行時ではなくビルド時に使用されるため、ボリュームをローカル記憶域(名前付きまたはそれ以外)にマップできない理由があります。 Dockerfilesはイメージを構築し、イメージはコンテナを作成するために使用されます。コンテナを実行している場合にのみ、ストレージの場所を指定します。 –