web-dev-qa-db-ja.com

Docker:Dockerfileがサブディレクトリにある場合にCOPYを使用する

複数の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)、これらのソリューションは良くありません。


だから、私の質問は:

元のディレクトリ構造を変更せずにこの問題を修正するにはどうすればよいですか?

  • dockerfiles、docker-compose.yml、または基本的なランタイムコマンドにどのような変更を加える必要がありますか?
  • すべてを整理するためのより良い方法はありますか?
  • WORKDIRコマンドはどうですか?

理想的には、最適なソリューションは開発(ローカル)環境と本番(リモート)環境の両方で機能するはずなので、今のところボリュームを避けましょう...

9
CodyAE

ここで行う必要があるのは、docker-compose.ymlファイル内のビルドセクションにcontext: .dockerfileを追加して、サービスが完全なディレクトリ構造を理解できるようにすることです。

# docker-compose.yml
version: "3"
services:
  webserver:
    build:
      context: .
      dockerfile: ./dockerfiles/webserver/Dockerfile
    image: webserver:php-Apache
14
vivekyad4v

COPY命令のスコープは、Dockerfileがあるフォルダーです。私の提案は、Dockerfileをパブリックフォルダーに変更し、命令をCOPY . /var/www/htmlに変更することです。

0
J. Ordaz