Docker:当Dockerfile位于子目录中时使用COPY

我正在使用多个dockerfiles (每个服务一个)构build一个应用程序。 我的应用程序的目录结构如下所示:

app ├── dockerfiles │ ├── webserver │ │ └── Dockerfile │ └── database │ └── Dockerfile ├── public └── <frontend> ├── db └── <data> [...] ├── LICENSE ├── README.md └── docker-compose.yml 

在我的networking服务器的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 

如果我将Web服务器的Dockerfile移动到应用程序的根目录,则此错误消失,因此我知道这是由path或构build上下文问题引起的。

而且知道这一点,我们可以通过以下两种方式之一来解决这个问题:

(1)为整个应用程序(在应用程序的根目录)使用一个Dockerfile ,或者

 app └── Dockerfile 

(2)为每个服务使用多个Dockerfiles (在应用程序的根目录下)。

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

这些解决scheme是不好的,因为使用一个docker文件/容器的一切是不是最好的做法 (1),并有多个这样组织的docker文件看起来凌乱(2)。


所以,我的问题是:

我们如何解决这个问题,而不改变我们原来的目录结构?

  • 需要对dockerfiles, docker-compose.yml或基本运行时命令进行哪些更改?
  • 有没有更好的方法来组织一切?
  • 那么WORKDIR命令呢?

理想情况下,最好的解决scheme应适用于开发(本地)和生产(远程)环境,所以让我们暂时避免卷…

你所需要做的就是添加context: . 和docker文件在docker-compose.yml文件中的构build部分,以便您的服务理解完整的目录结构。

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

COPY指令的作用域是Dockerfile所在的文件夹。 我的build议是将您的Dockerfile更改为公用文件夹,并将指令更改为COPY . /var/www/html COPY . /var/www/html