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
。