2017-12-13 19 views
2

私はmultiple dockerfiles(サービスごとに1つ)を使用してアプリケーションを構築しています。次のように私のアプリのディレクトリ構造は次のとおりです。Docker:Dockerfileがサブディレクトリにある場合のCOPYの使用

私のウェブサーバの Dockerfile
app 
├── dockerfiles 
│ ├── webserver 
│ │ └── Dockerfile 
│ └── database 
│  └── Dockerfile 
├── public 
    └── <frontend> 
├── db 
    └── <data> 
    [...] 
├── LICENSE 
├── README.md 
└── docker-compose.yml 

、私はCOPYコマンドを使用して、私の既存のコードにコピーしたい:

# Dockerfile 
COPY ./public /var/www/html 

そして私は私のdocker-compose.ymlを使用してアプリケーションをデプロイしたいですファイル:私は作業ディレクトリ(app)からdocker-composeを実行したときに

# docker-compose.yml 
version: "3" 
services: 
    webserver: 
     build: ./dockerfiles/webserver 
     image: webserver:php-apache 

しかし、私はFOを取得しますllowingエラー:

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アプリのルートに移動した場合、このエラーは消えるので、私はそれがパスによって引き起こされるまたはコンテキストの問題を構築しているということを知っています。 (アプリのルートで)全体のアプリのための

(1)を使用して1 Dockerfile、または

app 
└── Dockerfile 

そして、これを知って、私たちは、いずれかの方法で、問題の2つの方法のいずれかを修正することができます(2)各サービス(アプリのルートにある)に複数のDockerfilesを使用する。

app 
├── Dockerfile.webserver 
└── Dockerfile.database 

これらのソリューションは、すべてのために1 dockerfile /コンテナを使用してbest practice(1)ではないので悪いですが、この方法で編成複数dockerfilesを有するだけで乱雑になります(2)。


だから、私の質問は:

我々は元のディレクトリ構造を変更することなく、この問題を解決するにはどうすればよいですか? docker-compose.ymlに、基本的なランタイムコマンドに、dockerfilesに行われる必要がどのような変更

  • すべてを整理するより良い方法はありますか?
  • WORKDIRコマンドについてはどうなりますか?

理想的には、最善の解決策は、DEV(ローカル)および生産(遠隔)環境の両方のために働くので、今のところ、ボリュームを避けるせてください...

答えて

2

docker-compose.ymlファイル内のビルドセクションにcontext: .dockerfileを追加するだけで、サービスが完全なディレクトリ構造を理解できるようになります。

# docker-compose.yml 
version: "3" 
services: 
    webserver: 
    build: 
     context: . 
     dockerfile: ./dockerfiles/webserver/Dockerfile 
    image: webserver:php-apache 
+0

これは完全に機能しました。私はそれがビルドの文脈の問題でなければならないことを知っていましたが、私は解決策を探すのが非常に困難でした...これが近い将来同様の状況にある人を助けてくれることを願っています! – CodyAE

0

COPY命令の範囲はフォルダ場所ですドッカーファイルはです。 Dockerfileをパブリックフォルダに変更し、指示をCOPY . /var/www/htmlに変更することをお勧めします。

関連する問題