7

ディレクトリをホストと共有したいのです~/mydirが、Docker コンテナ ディレクトリをホスト ファイルに置き換えたくありません。ので、私は持っていますdocker-compose.yml

version: '2'
services:
  app:
    container_name: mono
    build: .
    volumes:
      # save .composer files on host to keep cache warmed up
      - '/srv/mono/mydir:/root/mydir'
    command: sleep infinity

Dockerfile

#/bin/bash
FROM php:5.6

RUN mkdir /root/mydir && echo '{}' > /root/mydir/myfile.json

VOLUME /root/mydir

ディレクトリ/srv/mono/mydirが空です。ホストディレクトリに置き換えられました。それは明確だ。

しかし、元のファイルを保持する方法は?

たとえば、MySQL Percona コンテナーで機能します。

version: '2'
services:
  percona-56:
    container_name: percona-56
    image: percona/percona-server:5.6
    volumes:
    - /srv/mysql/percona-56:/var/lib/mysql
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'

コンテナーの元のファイルがあります。

$ ll /srv/mysql/percona-56
total 176220
    auto.cnf
    error.log
    ibdata1
    ib_logfile0
    ib_logfile1
    init.ok
    mysql
    performance_schema

Percona Dockerfileを調べてみましたが、ボリューム共有に関連するものは見つかりませんでした。

$ docker --version
Docker version 1.12.3, build 6b644ec
4

1 に答える 1

15

docker run で VOLUME を追加すると、Docker がイメージに使用するコピー オン ライト ファイルシステムではなく、メイン ホスト ファイルシステムを使用することになります。ここには 2 つの主なオプションがあります。

  1. 実際のファイルシステムの場所をイメージにバインドマウントします。これがあなたがここでしていることです。
  2. Docker に場所の処理を任せます。この場合、Docker はメイン ファイル システムに場所を作成し、イメージの内容をその場所にコピーして作業を開始します。

両方を取得しようとしています-ファイルシステム上の固定の場所が必要ですが、イメージのファイルがそこにあるようにしたいです。さて、このように機能しない理由があります!「auto.conf」がそのフォルダーに既に存在し、コンテナーを起動するとどうなりますか? そのファイルの異なるバージョンが同じ場所を指している 2 つのコンテナーを実行するとどうなりますか? そのため、実際の場所を選択すると、イメージとファイルシステムの間の競合をどうするかを推測しようとせず、ファイルシステムに合わせて移動します。

あなたが望むものを達成することはできます。実際には 2 つのオプションがあります。より良い方法は、2 つの個別のフォルダー (イメージ内にあるフォルダーとファイルシステムにあるフォルダー) からアプリを読み取ることです。これにより、この問題は完全に回避されます ;) 2 番目のオプションは、Docker にイメージ内の個々のファイルの処理方法を指示することです。

version: '2'
services:
  app:
    container_name: mono
    build: .
    volumes:
      # save .composer files on host to keep cache warmed up
      - '/srv/mono/mydir:/root/mydir'
      # Marking a volume this way will tell Docker to use THIS file 
      # from the image, even though the parent directory is a regular
      # volume.  If you have an auto.cnf file in your directory, it
      # will be ignored. 
      - /root/mydir/auto.cnf
    command: sleep infinity

……

于 2016-11-08T16:20:12.590 に答える