我正在使用multiple dockerfiles构建一个应用程序(每个服务一个)。我的应用程序的目录结构如下:
app
├── dockerfiles
│ ├── webserver
│ │ └── Dockerfile
│ └── database
│ └── Dockerfile
├── public
└── <frontend>
├── db
└── <data>
[...]
├── LICENSE
├── README.md
└── docker-compose.yml
在我的网络服务器的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
但是,当我从工作目录(docker-compose )运行app 时,出现以下错误:
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)对整个应用程序使用一个Dockerfile (在应用程序的根目录中),或者
app
└── Dockerfile
(2)为每个服务使用多个Dockerfiles (在应用程序的根目录中)。
app
├── Dockerfile.webserver
└── Dockerfile.database
这些解决方案很糟糕,因为对所有内容使用一个dockerfile /容器不是best practice(1),并且以这种方式组织多个dockerfile看起来很混乱(2)。
所以,我的问题是:
我们如何在不更改原始目录结构的情况下解决此问题? 需要对dockerfile,docker-compose.yml 或基本运行时命令进行哪些更改? 是否有更好的方法来组织所有内容? WORKDIR 命令呢? 理想情况下,最好的解决方案应该同时适用于开发(本地)和生产(远程)环境,因此让我们暂时避免批量生产...
Best Answer-推荐答案
您要做的就是在docker-compose.yml文件的build部分中添加context: . 和dockerfile ,以便您的服务了解完整的目录结构。
# docker-compose.yml
version: "3"
services:
webserver:
build:
context: .
dockerfile: ./dockerfiles/webserver/Dockerfile
image: webserver:php-apache
关于docker - Docker:当Dockerfile位于子目录中时使用COPY,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/47785706/
|