私は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フォルダを作成します。ファイルではありません。
それとも設定を永続化する別の方法はありますか?
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
フォルダから起動した場合
私は同様の問題に苦しんでいました。イメージを再構築せずに必要なたびに修正できるように、私は自分の設定ファイルを自分のコンテナにインポートしようとしていました。
下記のコマンドで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
を上書きします。
私のように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 ...
見つけるのは難しいですが そこにあります
次のようなdocker-compose.yml
ファイルへの相対パスを使用することもできます(Windowsホスト、Linuxコンテナーでテスト済み):
volumes:
- ./test.conf:/fluentd/etc/test.conf
私にとっては、コンテナにマウントしようとしていたファイルに壊れたシンボリックリンクがあることが問題でした。
ボリュームではなくマウントを使用する(-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
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でファイルを共有する場合、コンテナと共有する前にファイルが存在している必要があります。
Windowsでも同じ問題がありました、Docker 18.06.1-ce-win73 (19507)
。
Docker設定パネルで共有ドライブを削除して再追加すると、すべてうまくいきました。