他の人にも同様の質問があったことは承知していますが、これは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
これは、MemSQLからの不適切なドキュメントにさかのぼります。 memsql/quickstart
コンテナのMemSQLデータパスは/memsql
であり、スタンドアロンインストール(およびMemSQLドキュメント)の/var/lib/memsql
ではなく、誰かが私に言ったように/data
ではありません。
これは古くて解決されたスレッドであり、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
これが役立つかどうかはわかりません。 docker-compose up -d
を使用すると、コンテナがダウンロードされ、イメージが作成されます。 Dockerイメージを停止するには、docker-compose down
を使用します。イメージは残り、docker-compose start
で再起動できます
Up/downコマンドを使用していて、停止/開始を試行してデータが保持されるまで、データを失っていました。
docker-compose down
を使用しており、ドキュメントを見ると here
コンテナーを停止し、
up
によって作成されたコンテナー、ネットワーク、ボリューム、およびイメージを削除します。デフォルトでは、コンテナとネットワークのみが削除されます。
そうです、それはボリュームを削除するべきではありません(デフォルト)。バグであるか、デフォルト設定を変更した可能性があります。しかし、あなたにとって正しいコマンドはdocker-compose stop
だと思います。 down
コマンドの単純なケースでいくつかのテストを実行してみます。
最も簡単な解決策は、docker-compose stop
の代わりに docker-compose down
。その後 docker-compose start
再起動します。
docs によると、down
"コンテナを停止し、upによって作成されたコンテナ、ネットワーク、ボリューム、およびイメージを削除します。"