子目录中有 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..不?
您有 2 个
Dockerfiles
,它们有各自不同的上下文。在每个上下文(文件夹)中,您都有 .dockerignore
,这是正确的。但是 .dockerignore
在构建上下文之外不起作用,这意味着使用 ../../
是错误的。我猜您假设这些文件适用于
docker
文件夹,但实际上它们分别适用于
docker/app
和
docker/web
。构建过程如下:
首先
docker cli
打包上下文(如果未明确指定,则使用
Dockerfile
的文件夹)并将其发送到
docker daemon
。此文件夹外部没有任何内容被发送。它是为
COPY
命令显式编写的,该命令用于将上下文项放入容器中:
如果有
src
路径必须位于构建的上下文内;你不能 COPY ../something /something,因为 docker 构建的第一步 是将上下文目录(和子目录)发送到docker 守护进程。
.dockerignore
,则在打包之前忽略的文件被排除。
我一直在努力解决这个问题,直到我发现这篇文章,它帮助我了解了我的案例中发生的事情。如果您将所有内容绑定到容器,例如
.:/app
或 .:/usr/src/app
(这在热重载开发过程中很常见),我们完全忽略 .dockerignore
,因为绑定挂载是在构建映像后附加的,甚至是被忽略的文件现在已安装到容器上。我删除了绑定,.dockerignore
中指定的文件被忽略。
我仍然在开发过程中绑定所有内容,但在构建生产映像时,我不绑定
.dockerignore
需要位于您在 docker-compose.yml
中指定的根目录/上下文文件夹中
对我有用的是将
.dockerignore
放在我的应用程序的根目录中,即 docker-compose.yml
所在的位置。
.dockerignore
是项目根目录中的预期语法,但是现在 Docker 会在与 Dockerfile 相同的目录中查找忽略文件,但必须相应命名。 我不知道 Docker Compose 在安装时会排除文件,但是对于构建容器,如果其结构如下,则将应用忽略文件:
docker-compose.yml
docker
├── app
│ ├── Dockerfile
│ └── Dockerfile.dockerignore
└── web
├── Dockerfile
├── nginx.conf
└── Dockerfile.dockerignore