私のdocker composeファイルには、web、nginx、postgresの3つのコンテナーがあります。 Postgresは次のようになります。
postgres:
container_name: postgres
restart: always
image: postgres:latest
volumes:
- ./database:/var/lib/postgresql
ports:
- "5432:5432
私の目標は、./database
というローカルフォルダーに対応するボリュームをpostgresコンテナー内に/var/lib/postgres
としてマウントすることです。これらのコンテナーを起動してpostgresにデータを挿入すると、/var/lib/postgres/data/base/
が(postgresコンテナー内で)追加するデータでいっぱいになっていることを確認しますが、ローカルシステムでは./database
はdata
フォルダーのみを取得します。つまり、./database/data
が作成されます、しかし空です。どうして?
ノート:
ニックの提案に従って、私はdocker inspect
をし、見つけました:
"Mounts": [
{
"Source": "/Users/alex/Documents/MyApp/database",
"Destination": "/var/lib/postgresql",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
},
{
"Name": "e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35",
"Source": "/var/lib/docker/volumes/e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35/_data",
"Destination": "/var/lib/postgresql/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
これにより、自分でコーディングしていない別のボリュームによってデータが盗まれているように見えます。なぜそうなのか分かりません。 postgresイメージはそのボリュームを作成しますか?その場合、再起動時にマウントしているボリュームの代わりにそのボリュームを使用する方法はありますか?それ以外の場合、その他のボリュームを無効にして、独自の./database
を使用する良い方法はありますか?
ニックのおかげで解決策を見つけました! (および別の友人)以下の回答。
不思議なことに、解決策は変更することになった
volumes:
- ./postgres-data:/var/lib/postgresql
に
volumes:
- ./postgres-data:/var/lib/postgresql/data
docker volume create pgdata
またはあなたはそれを作成ファイルに設定することができます
version: "3"
services:
db:
image: postgres
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgress
- POSTGRES_DB=postgres
ports:
- "5433:5432"
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- suruse
volumes:
pgdata:
ボリューム名 pgdata を作成し、このボリュームをコンテナのパスにマウントします。
docker volume inspect pgdata
// output will be
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
"Name": "pgdata",
"Options": {},
"Scope": "local"
}
]
相対パスは使用しないでください。 dockerはデーモンとクライアントの関係であることを忘れないでください。
あなたが作成を実行しているとき、それは基本的に単にさまざまなdocker clientコマンドに分割され、それらはその後デーモンに渡されます。その./database
は、クライアントではなく、 daemon に対して相対的です。
さて、 docker devチームはこの問題に関して前後にいくらか持っています しかし、肝心なのはそれがいくつかの予期しない結果をもたらすことができるということです。
つまり、相対パスではなく絶対パスを使用してください。
最初にdocker create -v /location --name
を使ってdockerの外部にボリュームを作成し、それを再利用する必要があると思います。
そして、私がdockerを多用していた頃には、dockerfile定義で静的dockerボリュームを使用することは不可能でしたので、私の提案はコマンドラインを試すことです(最終的にはスクリプトで)。