我正在使用多个Dockerfile(每个服务一个)构建一个应用程序。我的应用程序目录结构如下:
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
如果我将Web服务器的Dockerfile
移动到应用程序的根目录下,这个错误就会消失,因此我知道它是由路径或构建上下文问题引起的。
有了这个信息,我们可以通过以下两种方式之一来解决问题:
(1) 在整个应用程序中使用一个Dockerfile
(在应用程序的根目录下),或者
app
└── Dockerfile
(2) 对于每个服务,使用多个Dockerfiles
(在应用的根目录下)。
app
├── Dockerfile.webserver
└── Dockerfile.database
这些解决方案不好,因为使用一个 Dockerfile/容器来处理所有内容不是最佳实践(1),而且以这种方式组织多个 Dockerfile 只会显得杂乱无序(2)。
所以,我的问题是:
如何在不更改原始目录结构的情况下解决这个问题?
- 需要对dockerfiles、docker-compose.yml或基本运行命令进行哪些更改?
- 有没有更好的组织方式?
- 那么
WORKDIR
命令呢?
理想情况下,最好的解决方案应该适用于开发(本地)和生产(远程)环境,因此让我们暂时避免使用卷...