1. ホーム
  2. docker

[解決済み] ボリュームに単一ファイルをマウントする方法

2022-03-25 14:42:47

質問

PHPアプリケーションをDockerizeしようとしています。dockerfileの中で、アーカイブをダウンロードし、それを展開する、などを行っています。

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

そこで、データベースと同じように、ファイルをボリュームとしてマウントすればいいのではないかと考えました。

ボリュームと直接パスの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" caused \"not a directory"""

で試すと

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

Dockerはuploadフォルダを作成し、さらにconfig.phpフォルダを作成します。ファイルではありません。

それとも、コンフィグを永続化する他の方法があるのでしょうか?

解決方法は?

<ブロッククオート

TL;DR/注意事項

マウントしようとしているファイルの代わりにディレクトリが作成された場合、おそらく、マウントしようとするファイルに 有効 絶対 のパスがあります。これは、無言で混乱する失敗モードで、よくある間違いです。

ファイルボリュームはdockerでこのように行われます(絶対パスの例(環境変数使用可)、ファイル名を記載する必要があります):

    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 フォルダ