web-dev-qa-db-ja.com

Docker Compose v2でボリュームを永続的にする方法

他の人にも同様の質問があったことは承知していますが、これはv2構成ファイル形式を使用しているため、何も見つかりませんでした。

MemSQLを操作する非常にシンプルなテストアプリを作成したいのですが、docker-compose downの後にボリュームが削除されないようにすることができません。私がDocker Docsを正しく理解しているのであれば、明示的に指示しない限りボリュームを削除しないでください。すべてがdocker-compose upで動作するようですが、ダウンしてからアップすると、すべてのデータがデータベースから削除されます。

良い方法として推奨されているように、別のmemsqldataサービスを別のデータレイヤーとして使用しています。

これが私のdocker-compose.ymlです:

version: '2'
services:
    app:
        build: .
        links:
            - memsql
    memsql:
        image: memsql/quickstart
        volumes_from:
            - memsqldata
        ports:
            - "3306:3306"
            - "9000:9000"
    memsqldata:
        image: memsql/quickstart
        command: /bin/true
        volumes:
            - memsqldatavolume:/data

volumes:
    memsqldatavolume:
        driver: local
17
jimmy

これは、MemSQLからの不適切なドキュメントにさかのぼります。 memsql/quickstartコンテナのMemSQLデータパスは/memsqlであり、スタンドアロンインストール(およびMemSQLドキュメント)の/var/lib/memsqlではなく、誰かが私に言ったように/dataではありません。

4
jimmy

これは古くて解決されたスレッドであり、OPはマウントされたボリュームではなく、コンテナー内のディレクトリを指していましたが、私が見ているいくつかの誤った情報をクリアしたかったのです。

docker-compose downはボリュームを削除しません。ボリュームも削除する場合は、docker-compose down -vを実行する必要があります。 docker-composeのヘルプテキストを次に示します(「デフォルト」のリストに注意してください)。

$ docker-compose down --help
Stops containers and removes containers, networks, volumes, and images
created by `up`.

By default, the only things removed are:

- Containers for services defined in the Compose file
- Networks defined in the `networks` section of the Compose file
- The default network, if one is used

Networks and volumes defined as `external` are never removed.

Usage: down [options]

Options:
...
    -v, --volumes       Remove named volumes declared in the `volumes` section
                        of the Compose file and anonymous volumes
                        attached to containers.
...

$ docker-compose --version
docker-compose version 1.12.0, build b31ff33

テストする名前付きボリュームとダミーコマンドを含むサンプルymlは次のとおりです。

$ cat docker-compose.vol-named.yml
version: '2'

volumes:
  data:

services:
  test:
    image: busybox
    command: tail -f /dev/null
    volumes:
    - data:/data

$ docker-compose -f docker-compose.vol-named.yml up -d
Creating volume "test_data" with default driver
Creating test_test_1

コンテナーを起動した後、その場所ではイメージが空であるため、ボリュームは空に初期化されます。その場所に簡単なHello Worldを作成しました。

$ docker exec -it test_test_1 /bin/sh
/ # ls -al /data
total 8
drwxr-xr-x    2 root     root          4096 May 23 01:24 .
drwxr-xr-x    1 root     root          4096 May 23 01:24 ..
/ # echo "hello volume" >/data/hello.txt
/ # ls -al /data
total 12
drwxr-xr-x    2 root     root          4096 May 23 01:24 .
drwxr-xr-x    1 root     root          4096 May 23 01:24 ..
-rw-r--r--    1 root     root            13 May 23 01:24 hello.txt
/ # cat /data/hello.txt
hello volume
/ # exit

ボリュームはDockerの外に表示され、docker-compose downの後にまだ存在します:

$ docker volume ls | grep test_
local               test_data

$ docker-compose -f docker-compose.vol-named.yml down
Stopping test_test_1 ... done
Removing test_test_1 ... done
Removing network test_default

$ docker volume ls | grep test_
local               test_data

コンテナを再作成すると、古いボリュームが使用され、ファイルは内部に表示されたままになります。

$ docker-compose -f docker-compose.vol-named.yml up -d
Creating network "test_default" with the default driver
Creating test_test_1

$ docker exec -it test_test_1 /bin/sh
/ # cat /data/hello.txt
hello volume
/ # exit

そしてdocker-compose down -vを実行すると、最終的にコンテナとボリュームの両方が削除されます。

$ docker-compose -f docker-compose.vol-named.yml down -v
Stopping test_test_1 ... done
Removing test_test_1 ... done
Removing network test_default
Removing volume test_data

$ docker volume ls | grep test_

$

ダウン/アップではなくストップ/スタートを使用した場合にのみデータが永続化されている場合、データは名前付きボリュームではなくコンテナ(または匿名ボリューム)に格納されており、コンテナは持続的。これを回避するには、コンテナー内のデータの場所が正しいことを確認してください。

コンテナー内のデータが格納されている場所をデバッグするには、コンテナーでdocker diffを使用することをお勧めします。コンテナが削除されると失われる、そのコンテナ内で作成、変更、または削除されたすべてのファイルが表示されます。例えば。:

$ docker run --name test-diff busybox \
  /bin/sh -c "echo hello docker >/etc/hello.conf"

$ docker diff test-diff
C /etc
A /etc/hello.conf
25
BMitch

これが役立つかどうかはわかりません。 docker-compose up -dを使用すると、コンテナがダウンロードされ、イメージが作成されます。 Dockerイメージを停止するには、docker-compose downを使用します。イメージは残り、docker-compose startで再起動できます

Up/downコマンドを使用していて、停止/開始を試行してデータが保持されるまで、データを失っていました。

2
Bobby McGill

docker-compose downを使用しており、ドキュメントを見ると here

コンテナーを停止し、upによって作成されたコンテナー、ネットワーク、ボリューム、およびイメージを削除します。デフォルトでは、コンテナとネットワークのみが削除されます。

そうです、それはボリュームを削除するべきではありません(デフォルト)。バグであるか、デフォルト設定を変更した可能性があります。しかし、あなたにとって正しいコマンドはdocker-compose stopだと思います。 downコマンドの単純なケースでいくつかのテストを実行してみます。

2

最も簡単な解決策は、docker-compose stop の代わりに docker-compose down。その後 docker-compose start 再起動します。

docs によると、down "コンテナを停止し、upによって作成されたコンテナ、ネットワーク、ボリューム、およびイメージを削除します。"

2
Jonathan Stray