0

空のディレクトリから始めて、これを作成しましたdocker-compose.yml

version: '3.9'
services:
  neo4j:
    image: neo4j:3.2
    restart: unless-stopped
    ports:
      - 7474:7474
      - 7687:7687
    volumes:
      - ./conf:/conf
      - ./data:/data
      - ./import:/import
      - ./logs:/logs
      - ./plugins:/plugins
    environment:
      # Raise memory limits
      - NEO4J_dbms_memory_pagecache_size=1G
      - NEO4J_dbms.memory.heap.initial_size=1G
      - NEO4J_dbms_memory_heap_max__size=1G

import次に、コンテナーで操作する予定のデータ ファイルを含むディレクトリを追加します。

この時点で、私のディレクトリは次のようになります。

0 drwxr-xr-x   9 cc  staff  288 Dec 11 18:57 .
0 drwxr-xr-x   5 cc  staff  160 Dec 11 18:15 ..
8 -rw-r--r--   1 cc  staff  458 Dec 11 18:45 docker-compose.yml
0 drwxr-xr-x  20 cc  staff  640 Dec 11 18:57 import

を実行するdocker-compose up -d --buildと、コンテナがビルドされます。ローカル ディレクトリは次のようになります。

0 drwxr-xr-x   9 cc  staff  288 Dec 11 18:57 .
0 drwxr-xr-x   5 cc  staff  160 Dec 11 18:15 ..
0 drwxr-xr-x   2 cc  staff   64 Dec 11 13:59 conf
0 drwxrwxrwx@  4 cc  staff  128 Dec 11 18:08 data
8 -rw-r--r--   1 cc  staff  458 Dec 11 18:45 docker-compose.yml
0 drwxr-xr-x  20 cc  staff  640 Dec 11 18:57 import
0 drwxrwxrwx@  3 cc  staff   96 Dec 11 13:59 logs
0 drwxr-xr-x   3 cc  staff   96 Dec 11 15:32 plugins

、、、confおよびディレクトリが作成されdataますlogsplugins

datalogsは Neo4j イメージのビルドから取り込まれconfplugins予想どおり空です。

コンテナのディレクトリ構造を確認するために使用docker execします。

     8 drwx------    1 neo4j    neo4j         4096 Dec 11 23:46 .
     8 drwxr-xr-x    1 root     root          4096 May 11  2019 ..
    36 -rwxrwxrwx    1 neo4j    neo4j        36005 Feb 18  2019 LICENSE.txt
   128 -rwxrwxrwx    1 neo4j    neo4j       130044 Feb 18  2019 LICENSES.txt
    12 -rwxrwxrwx    1 neo4j    neo4j         8493 Feb 18  2019 NOTICE.txt
     4 -rwxrwxrwx    1 neo4j    neo4j         1594 Feb 18  2019 README.txt
     4 -rwxrwxrwx    1 neo4j    neo4j           96 Feb 18  2019 UPGRADE.txt
     8 drwx------    1 neo4j    neo4j         4096 May 11  2019 bin
     4 drwxr-xr-x    2 neo4j    neo4j         4096 Dec 11 23:46 certificates
     8 drwx------    1 neo4j    neo4j         4096 Dec 11 23:46 conf
     0 lrwxrwxrwx    1 root     root             5 May 11  2019 data -> /data
     4 drwx------    1 neo4j    neo4j         4096 Feb 18  2019 import
     8 drwx------    1 neo4j    neo4j         4096 May 11  2019 lib
     0 lrwxrwxrwx    1 root     root             5 May 11  2019 logs -> /logs
     4 drwx------    1 neo4j    neo4j         4096 Feb 18  2019 plugins
     4 drwx------    1 neo4j    neo4j         4096 Feb 18  2019 run

私の問題はimport、コンテナー内のディレクトリが空であることです。datalogsディレクトリは空ではありません。

私のローカルのdataおよびディレクトリには、 および にはないlogs拡張属性がconfあります。plugins

xattr -l data
com.docker.grpcfuse.ownership: {"UID":100,"GID":101}

私が特定できる唯一の違いはdocker-compose、Neo4j イメージを取得したときにデータが作成されたディレクトリがあることです。

ここで何が起こっているのかを理解している人はいますか?どうすればこれを機能させることができるか教えてください。Mac OS X 10.15 と docker-compose バージョン 1.27.4、ビルド 40524192 を使用しています。

ありがとう。

4

1 に答える 1

1

TL;DR: 現在のセットアップはおそらく問題なく動作します。


観察している特定の動作を確認するには:

  1. コンテナーの起動時に、Docker は、ホストに空のディレクトリが存在しない場合は作成し、コンテナー内にマウントポイント ディレクトリを作成します。(これが、これらのディレクトリが表示される理由です。)

  2. Dockerがイメージからバインド マウントにデータをコピーすることはありません。この動作は、名前付きボリュームに対してのみ発生します (そして、それらを最初に使用するときのみであり、その後の実行では発生しません。また、Kubernetes ではなく、ネイティブ Docker でのみ発生します)。

  3. ただし、標準のデータベース イメージは通常、空のデータ ディレクトリを初期化する方法を知っています。neo4jimageの場合、そのDockerfileENTRYPOINTはコンテナーの起動時に実行されるディレクティブで終わります。docker-entrypoint.shさまざまな種類の初回セットアップの方法を知っています。それがデータが に入る方法./dataです。

  4. WORKDIR /var/lib/neo4jイメージは、 (中間環境変数を介して)も宣言します。それは、あなたのls -lリストに、のようなシンボリックリンクがある理由を説明していますdata -> /data。バインド マウントは です/importが、 の場合docker-compose exec neo4j ls import、それに対して相対的にWORKDIR見えるため、ディレクトリが空に見えます。

  5. ただし、エントリポイント スクリプトは具体的に/importはコンテナー内のディレクトリを探し、それが存在して読み取り可能な場合は、環境変数を設定しますNEO4J_dbms_directories_import=/import

これはすべて、セットアップが正しいことを示唆しており、インポートを実行しようとすると、正しく機能し、ホスト データが表示されます。イメージからディレクトリを見ていますが/var/lib/neo4j/import、それは空ですが、イメージのスタートアップはコンテナー内も探す必要があることを認識し/importており、マウントポイントはそこにあります。

于 2020-12-12T00:43:59.527 に答える