複数のdockerfiles (サービスごとに1つ)を使用してアプリを構築しています。私のアプリのディレクトリ構造は次のとおりです。
app
├── dockerfiles
│ ├── webserver
│ │ └── Dockerfile
│ └── database
│ └── Dockerfile
├── public
└── <frontend>
├── db
└── <data>
[...]
├── LICENSE
├── README.md
└── docker-compose.yml
WebサーバーのDockerfile
で、COPY
コマンドを使用して既存のコードをコピーしたいと思います。
# Dockerfile
COPY ./public /var/www/html
そして、docker-compose.yml
ファイルを使用してアプリをデプロイしたいと思います。
# docker-compose.yml
version: "3"
services:
webserver:
build: ./dockerfiles/webserver
image: webserver:php-Apache
ただし、作業ディレクトリ(app
)からdocker-compose
を実行すると、次のエラーが発生します。
Building webserver
Step 1/2 : FROM php:7.1.11-Apache-jessie
---> cb6a5015ad72
Step 2/2 : COPY ./public /var/www/html
Service 'webserver' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder193736188/public: no such file or directory
このエラーは、ウェブサーバーのDockerfile
をアプリのルートに移動すると消えるので、パスまたはビルドコンテキストの問題が原因であることがわかります。
そして、これを知っていると、次の2つの方法のいずれかで問題を修正できます。
(1)アプリ全体(アプリのルート内)に1つのDockerfile
を使用する、または
app
└── Dockerfile
(2)サービスごとに複数のDockerfiles
を使用する(アプリのルート内)。
app
├── Dockerfile.webserver
└── Dockerfile.database
すべてに1つのdockerfile/containerを使用することは ベストプラクティス (1)ではなく、このように複数のdockerfileを編成することは面倒に見えるため(2)、これらのソリューションは良くありません。
だから、私の質問は:
元のディレクトリ構造を変更せずにこの問題を修正するにはどうすればよいですか?
docker-compose.yml
、または基本的なランタイムコマンドにどのような変更を加える必要がありますか?WORKDIR
コマンドはどうですか?理想的には、最適なソリューションは開発(ローカル)環境と本番(リモート)環境の両方で機能するはずなので、今のところボリュームを避けましょう...
ここで行う必要があるのは、docker-compose.ymlファイル内のビルドセクションにcontext: .
とdockerfile
を追加して、サービスが完全なディレクトリ構造を理解できるようにすることです。
# docker-compose.yml
version: "3"
services:
webserver:
build:
context: .
dockerfile: ./dockerfiles/webserver/Dockerfile
image: webserver:php-Apache
COPY
命令のスコープは、Dockerfileがあるフォルダーです。私の提案は、Dockerfileをパブリックフォルダーに変更し、命令をCOPY . /var/www/html
に変更することです。