Docker-compose 和 .dockerignore

问题描述 投票:0回答:5

子目录中有 docker-compose 的小配置,其中包含 Dockerfiles 和 .dockerignore 文件。我无法理解为什么我的图像在构建后包含所有内容,即使我在 .dockerignore 中有一些需要忽略的项目。这是我有的

docker-compose.yml
docker
├── app
│   ├── Dockerfile
│   └── .dockerignore
└── web
    ├── Dockerfile
    ├── nginx.conf
    └── .dockerignore

.dockerignore 示例:

**/.dockerignore
docker-compose.yml
log
**/log
../../log

我只是按如下方式运行:

docker-compose up -d --build --no-cache

以上都没有被忽略..我做错了什么?

docker-compose version 1.23.2, build 1110ad01

为应用程序服务添加 Dockerfile(请参阅 docker-compose)。 Docker-compose 使用 ROR app 和 nginx 打包两个镜像。对于这两个 dockerfile,我都有 dockerignore。所以我的理解是我可以说出我到底想要什么。但事实并非如此。如何忽略包中的某些文件?或者我应该将 Dockerfile 和 dockerignore 放在不同的路径中,因为构建仅在上下文中起作用..我很困惑。

FROM ruby:2.4.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs imagemagick
# Configuring main directory
RUN mkdir -p /var/www/example.com
WORKDIR /var/www/example.com
# Setting env up
ENV RAILS_ENV='production'
ENV RACK_ENV='production'

# Adding gems
COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock
RUN bundle install --jobs 20 --retry 5 --without development test
# Adding project files
COPY . .

EXPOSE 3000
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]

所以我认为

COPY . . 
首先检查.dockerignore..不?

docker docker-compose
5个回答
29
投票

您有 2 个

Dockerfiles
,它们有各自不同的上下文。在每个上下文(文件夹)中,您都有
.dockerignore
,这是正确的。但是
.dockerignore
在构建上下文之外不起作用,这意味着使用 ../../
 是错误的。

我猜您假设这些文件适用于

docker

 文件夹,但实际上它们分别适用于 
docker/app
docker/web

构建过程如下:

首先

docker cli

 打包上下文(如果未明确指定,则使用 
Dockerfile
 的文件夹)并将其发送到 
docker daemon
。此文件夹
外部没有任何内容被发送。它是为 COPY
 命令显式编写的,该命令用于将上下文项放入容器中:

src

路径必须位于构建的上下文内;你不能
  COPY ../something /something,因为 docker 构建的第一步
  是将上下文目录(和子目录)发送到docker
  守护进程。

如果有

.dockerignore

,则在打包之前
忽略的文件被排除


23
投票

我一直在努力解决这个问题,直到我发现这篇文章,它帮助我了解了我的案例中发生的事情。如果您将所有内容绑定到容器,例如

.:/app
.:/usr/src/app
(这在热重载开发过程中很常见),我们完全忽略
.dockerignore
,因为绑定挂载是在构建映像后附加的,甚至是被忽略的文件现在已安装到容器上。我删除了绑定,
.dockerignore
中指定的文件被忽略。

我仍然在开发过程中绑定所有内容,但在构建生产映像时,我不绑定


14
投票

.dockerignore
需要位于您在
docker-compose.yml

中指定的根目录/上下文文件夹中

6
投票

对我有用的是将

.dockerignore
放在我的应用程序的根目录中,即
docker-compose.yml
所在的位置。


0
投票

.dockerignore
是项目根目录中的预期语法,但是现在 Docker 会在与 Dockerfile 相同的目录中查找忽略文件,但必须相应命名。 我不知道 Docker Compose 在安装时会排除文件,但是对于构建容器,如果其结构如下,则将应用忽略文件:

docker-compose.yml
docker
├── app
│   ├── Dockerfile
│   └── Dockerfile.dockerignore
└── web
    ├── Dockerfile
    ├── nginx.conf
    └── Dockerfile.dockerignore
© www.soinside.com 2019 - 2024. All rights reserved.