web-dev-qa-db-ja.com

単一ファイルをボリュームにマウントする方法

私はphpアプリケーションをドッキングしようとしています。 dockerfileにアーカイブをダウンロードして解凍します。

しかし、新しいバージョンがリリースされた場合はすべてがうまく機能します。そして、config.phpが上書きされるため、dockerfileを更新してアプリケーションを再インストールする必要があります。

データベースと同じように、ファイルをボリュームとしてマウントできると思いました。

ボリュームとダイレクトパスの2つの方法で試しました。

docker-compose:

version: '2'
services:
  app:
    build: src
    ports:
      - "8080:80"
    depends_on:
      - mysql
    volumes:
      -  app-conf:/var/www/html/upload
      -  app-conf:/var/www/html/config.php
    environment:
      DB_TYPE: mysql
      DB_MANAGER: MysqlManager

  mysql:
    image: mysql:5.6
    container_name: mysql
    volumes:
      - mysqldata:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD:
      MYSQL_DATABASE:
      MYSQL_USER:
      MYSQL_PASSWORD:

volumes:
  mysqldata:
  app-conf:

これはエラーになります。

そしてマウントされたボリュームとして、与えられたパスで試しました。

/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php

しかし、両方の方法が機能していません。マウントされたボリュームでアップロードが作成されるのがわかります。

しかし失敗します

/var/www/html/config.php \\ "原因\\"はディレクトリではありません\\ "\" "

/src/docker/myapp/upload/config.php:/var/www/html/config.phpで試してみると

Dockerはアップロードフォルダを作成し、次にconfig.phpフォルダを作成します。ファイルではありません。

それとも設定を永続化する別の方法はありますか?

124
Jakub Juszczak

TL; DR /通知:

マウントしようとしているファイルの代わりにディレクトリが作成されているのであれば、おそらく valid absolute のパスの指定に失敗しています。これは、サイレントで紛らわしい障害モードの一般的な間違いです。

ファイルボリュームはdockerでこのようにして作られます(絶対パスの例(env変数を使うことができます)、そしてあなたはファイル名を述べる必要があります):

    volumes:
      - /src/docker/myapp/upload:/var/www/html/upload
      - /src/docker/myapp/upload/config.php:/var/www/html/config.php

次のこともできます。

    volumes:
      - ${PWD}/upload:/var/www/html/upload
      - ${PWD}/upload/config.php:/var/www/html/config.php

Docker-composeを/src/docker/myappフォルダから起動した場合

160
BlackStork

私は同様の問題に苦しんでいました。イメージを再構築せずに必要なたびに修正できるように、私は自分の設定ファイルを自分のコンテナにインポートしようとしていました。

下記のコマンドでDocker Hostの$(pwd)/config.py/root/app/config.pyにファイルとしてコンテナにマッピングすると思いました。

docker run -v $(pwd)/config.py:/root/app/config.py my_docker_image

ただし、ファイルではなく、常にconfig.pyという名前のディレクトリが作成されました。

手がかりを探している間、私は理由を見つけました( ここ から)

Dockerホストにまだ存在していないファイルまたはディレクトリを-vまたは--volumeを使用してバインドマウントすると、-vによってエンドポイントが作成されます。 常にディレクトリとして作成されます

したがって、私のdocker Hostは$(pwd)/config.pyを持っていないので、それは常にディレクトリとして作成されます。

Docker Hostにconfig.pyを作成しても。 $(pwd)/config.py/root/app/config.pyをエクスポートしないだけで/root/app/config.pyを上書きします。

59
SangminKim

私のようにWindowsコンテナを使用している人は、Windowsコンテナを使用して単一のファイルをバインドまたはマウントすることはできません。

次の例は、Windowsベースのコンテナを使用している場合は失敗します。コンテナ内のボリュームまたはバインドマウントの宛先は、次のいずれかにする必要があるためです。存在しないディレクトリまたは空のディレクトリ。またはC:以外のドライブ。さらに、 バインドマウントのソースは、ファイルではなくローカルディレクトリでなければなりません

Net Use z: \\remotemachine\share

docker run -v z:\foo:c:\dest ...

docker run -v \\uncpath\to\directory:c:\dest ...

docker run -v c:\foo\somefile.txt:c:\dest ...

docker run -v c:\foo:c: ...

docker run -v c:\foo:c:\existing-directory-with-contents ...

見つけるのは難しいですが そこにあります

Windowsコンテナへのファイルのマッピングに関するGithubの問題へのリンク

2
Justin Lessard

次のようなdocker-compose.ymlファイルへの相対パスを使用することもできます(Windowsホスト、Linuxコンテナーでテスト済み):

 volumes:
      - ./test.conf:/fluentd/etc/test.conf
1
Daniel

私にとっては、コンテナにマウントしようとしていたファイルに壊れたシンボリックリンクがあることが問題でした。

0
jla

ボリュームではなくマウントを使用する(-v)詳細情報: https://docs.docker.com/storage/bind-mounts/

例:dockerに/tmp/a.txtが存在することを確認します。Host dockerを実行します。-it --mount type = bind、source =/tmp/a.txt、target =/root/a.txt Alpine sh

0
Subbu M

Windowsでは、docker-compose.ymlで$ {PWD} env変数が必要な場合は、docker-compose.ymlファイルと同じディレクトリに.envファイルを作成し、フォルダーの場所を手動で挿入できます。

CMD(pwd_var.bat):

echo PWD=%cd% >> .env

Powershell(pwd_var.ps1):

$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'; echo "PWD=$(get-location).path" >> .env

Docker-compose .env変数には、より良い機能があります: https://docs.docker.com/compose/reference/envvars/ 特にdockerを許可するCOMPOSE_CONVERT_WINDOWS_PATHS env変数についてbaskslash "\"を使用してWindowsパスを受け入れるように作成します。

Windowsでファイルを共有する場合、コンテナと共有する前にファイルが存在している必要があります。

0
CallMarl

Windowsでも同じ問題がありました、Docker 18.06.1-ce-win73 (19507)

Docker設定パネルで共有ドライブを削除して再追加すると、すべてうまくいきました。

0
Pool