2017-08-16 14 views
0

Dockerのdocumentationは、ボリュームを「移行」できると述べています。これは、あるホストから別のホストにボリュームを移動できる必要があると想定しています。 (この点については喜んで訂正することができます。)しかし、同じドキュメントページでは、これを行う方法についての情報は提供されていません。ホスト間でDockerボリュームを移行する方法は?

older(2015年頃)の質問には、これは不可能だと言われていますが、2年後にもう一度聞いてみると思いました。

役立つ場合は、[TinyDB] +ローカルディスクをデータストレージとして使用するFlaskアプリを開発しています。これ以上のものは必要ないと判断しました。これは現時点での学習のために行われたプロジェクトなので、非常に軽量化することに決めました。このプロジェクトは、次のような構造になっています。彼らはバージョン管理下に置かれていないとイメージを構築するときにドッカーによって無視されるように

/project_directory 
|- /app 
    |- __init__.py 
    |- ... 
|- run.py # assumes `data/databases/ and data/files/` are present 
|- Dockerfile 
|- data/ 
    |- databases/ 
     |- db1.json 
     |- db2.json 
    |- files/ 
     |- file1.pdf 
     |- file2.pdf 

私は、私の.dockerignore.gitignore内のフォルダdata/*を持っています。

私はこのアプリを開発する際に、できるだけ実際に近いデータベースとPDFを扱おうとしています。そのため、実際のデータの非常に小さなサブセットでアプリをシードしました。 Dockerコンテナのインスタンス化時に直接data/にマウントされたボリューム。

私がしたいことは、リモートホストにコンテナを展開することですが、リモートホストにスターターデータがシードされていることです(理想的には、利便性を最大限に高めるためにローカルで使用していたボリュームです)。後でさらに多くのデータがリモートホストに追加されるにつれて、私はそれを取り戻すことができ、開発中にエンドユーザーが入力した最新のデータを扱うようにしたいと考えています。

私がやっている "ハッキー"なやり方は、ちょうどうまくいくかもしれないrsyncを使っています。しかし、欠けている解決策があれば、私は大いに参考に感謝します!

+1

これは役に立つかもしれないhttps://www.guidodiepen.nl/2016/05/transfer-docker-data-volume-to-another-host/ – yamenk

答えて

2

私がこれにアプローチする方法は、開発環境をシードするデータのコピーを格納するDockerコンテナを生成することです。そのコンテナ内のデータをボリュームとして公開し、最後にそのボリュームを開発コンテナにマウントすることができます。私は例を挙げて説明します:

は、まず私達はちょうどあなたのシード・データとそれ以外のものが含まれているドッカーコンテナを作成しようとしているデータコンテナ

を作成します。私は~/data/DockerfileDockerfileを作成し、それを次の内容を与えるだろう:

FROM alpine:3.4 
ADD . /data 
VOLUME /data 
CMD /bin/true 

あなたは、その後でこれを構築することができ:

docker build -t myproject/my-seed-data .

これはあなたにmyproject/my-seed-data:latestとしてタグ付けドッカーイメージを作成します。イメージには、環境内にシードしたいすべてのデータが含まれており、イメージ内には/dataという名前で格納されています。コンテナとしてイメージのインスタンスを作成すると、/data内のすべてのファイルがボリュームとして公開されます。あなたは今、次の操作を実行することを拡張することができ

docker run -d -v $(pwd)/data:/data your-container-image <start_up_command>

別ドッカーコンテナ

私はあなたがこのようなあなたのドッカーコンテナ何かを実行している想像にボリュームをマウント

docker run -d --name seed-data myproject/my-seed-data 
docker run -d --volumes-from seed-data your-container-image <start_up_command> 

ここでは、最初にinstancを作成していますあなたのシードデータコンテナの次に、開発コンテナのインスタンスを作成し、データコンテナからそのボリュームにボリュームをマウントします。つまり、開発コンテナ内のシードデータは/dataになります。

これは、あなたが2つのコマンドを実行する必要が知っている痛みの少しを取得し、私たちは先に行くとドッカー作曲

とドッカー作曲

シンプルなオーケストレーションのようなもので少し良くそれを編成でき

Docker Composeは、複数のコンテナを同時に実行する方法です。あなたは、ご使用の環境がどのように見えると定義するようなことを行うために必要なものを宣言することができます。

「私の開発コンテナが私のシードデータコンテナのインスタンスに依存して」

をあなたが必要なものをレイアウトするdocker-compose.ymlファイルを作成します。あなたはその後、一度docker-compose up -d my_appを使用してのすべてのコンテナを開始することができます

version: 2 
services: 
    seed-data: 
    image: myproject/my-seed-data:latest 

    my_app: 
    build: . 
    volumes_from: 
    - seed-data 
    depends_on: 
    - seed-data 

:それは次のようになります。 Docker Composeは、最初にデータコンテナのインスタンスを起動し、最後にアプリケーションコンテナを起動するほどスマートです。ホスト

間のデータコンテナを共有

これを行う最も簡単な方法は、Docker Hubに画像としてデータコンテナをプッシュすることです。あなたがイメージを構築していたら、次のように、それはドッカーハブにプッシュすることができます。

docker push myproject/my-seed-data:latest

それは代わりに、あなたがプッシュしている。この場合には、Gitはリモートリポジトリにコミットするプッシュの概念と非常に似ていますドッカー画像。しかし、これが意味することは、どんな環境でもこのイメージを引き出し、そのイメージに含まれるデータを使用できることです。つまり、新しいシードデータがあるときにデータイメージを再生成し、:latestタグの下にDocker Hubにプッシュすると、開発環境を再起動すると最新のデータが得られます。

私にとって、これはデータを共有する「Docker」の方法であり、Docker環境間で物事を移植可能に保ちます。 JenkinsのようなCI環境内のジョブによって定期的にデータコンテナを生成するようなこともできます。

+0

これはそれでした!ありがとう、@ rob-blake!:D:D:D – ericmjl

+0

あなたが親切であれば、私の遠隔ホストの私のユーザーが新しいデータを追加したと言っています。 'ドッカーコミット'(私はそれが本当に速く醜いと聞く)、これを行う方法はありますか? – ericmjl

+1

@ericmjlたとえば、データをコンテナから 'docker cp'して、そのデータに基づいて別のDataコンテナを構築し、新しいデータコンテナをDocker Hubにプッシュして、それをローカルに' docker pull'することができます。上記は日常的にスクリプト化され、CIサーバによって管理される。ジェンキンス理にかなっている? –

関連する問題