Docker:当 Dockerfile 位于子目录中时使用 COPY

标签 docker copy docker-compose dockerfile directory-structure

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

但是,当我从工作目录 (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

如果我将网络服务器的 Dockerfile 移动到应用程序的根目录,此错误就会消失,因此我知道它是由路径或构建上下文问题引起的。

知道了这一点,我们可以通过以下两种方法之一解决问题:

(1) 为整个应用(在应用的根目录中)使用一个 Dockerfile,或

app
└── Dockerfile

(2) 为每个服务(在应用的根目录中)使用多个 Dockerfile

app
├── Dockerfile.webserver
└── Dockerfile.database

这些解决方案很糟糕,因为使用一个 dockerfile/container 处理所有事情不是 best practice (1),并且以这种方式组织多个 dockerfile 看起来很困惑 (2)。


所以,我的问题是:

我们如何在不改变我们原来的目录结构的情况下解决这个问题?

  • 需要对 dockerfile、docker-compose.yml 或基本运行时命令进行哪些更改?
  • 有没有更好的方法来组织所有内容?
  • WORKDIR 命令呢?

理想情况下,最好的解决方案应该同时适用于开发(本地)和生产(远程)环境,所以让我们暂时避免卷...

最佳答案

您只需在 docker-compose.yml 文件中的构建部分添加 context: .dockerfile ,以便您的服务了解完整目录结构。

# docker-compose.yml
version: "3"
services:
  webserver:
    build:
      context: .
      dockerfile: ./dockerfiles/webserver/Dockerfile
    image: webserver:php-apache

关于Docker:当 Dockerfile 位于子目录中时使用 COPY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47785706/

相关文章:

java - 如何读取文件夹、计算文件数量并复制到新文件夹

excel - 具有列别名的 PSQL 到 CSV 导致文件损坏

node.js - Docker MongoDB收到元数据后立即关闭连接

docker - 如何让我的 Docker compose "wait-for-it"脚本调用原始容器 ENTRYPOINT 或 CMD?

postgresql - 将在Docker容器中运行的PostgreSQL服务器连接到Wild-fly Docker容器?

elasticsearch - 如何在Docker中以root用户身份运行Elasticsearch 5.2.1

mongodb - 为不存在的数据库创建用户不起作用

azure - Docker 镜像无法推送到 azure 注册表

java - 以编程方式将文件复制到 BlackBerry

docker - 使用 Apple Silicon M1 在 Docker 上运行 gem install bundler 时出现 Qemu 错误