OStack程序员社区-中国程序员成长平台

标题: docker - Docker:当Dockerfile位于子目录中时使用COPY [打印本页]

作者: 菜鸟教程小白    时间: 2022-8-3 10:11
标题: docker - Docker:当Dockerfile位于子目录中时使用COPY

我正在使用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/






    欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4