作者:笃志单车小博_801 | 来源:互联网 | 2023-01-05 12:28
我正在使用多个dockerfiles构建一个应用程序(每个服务一个).我的应用程序的目录结构如下:
app
??? dockerfiles
? ??? webserver
? ? ??? Dockerfile
? ??? database
? ??? Dockerfile
??? public
???
??? db
???
[...]
??? 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
为每个服务使用multiple (在应用程序的根目录中).
app
??? Dockerfile.webserver
??? Dockerfile.database
这些解决方案很糟糕,因为对一切使用一个dockerfile /容器不是最佳实践(1),并且以这种方式组织多个dockerfiles看起来很混乱(2).
所以,我的问题是:
如何在不更改原始目录结构的情况下解决此问题?
需要对dockerfiles,to docker-compose.yml
或基本运行时命令进行哪些更改?
是否有更好的方法来组织一切?
WORKDIR
命令怎么样?
理想情况下,最佳解决方案应该适用于开发(本地)和生产(远程)环境,所以让我们现在避免使用卷...
1> vivekyad4v..:
你需要做的就是在docker-compose.yml文件中的build部分中添加context: .
,dockerfile
以便你的服务理解完整的目录结构.
# docker-compose.yml
version: "3"
services:
webserver:
build:
context: .
dockerfile: ./dockerfiles/webserver/Dockerfile
image: webserver:php-apache