Docker-compose和.dockerignore

Evg*_*eny 3 docker docker-compose

我在子目录中有带有dockerfiles和.dockerignore文件的docker-compose小配置。我什至无法理解为什么构建后的映像包含所有内容,即使我在.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"]
Run Code Online (Sandbox Code Playgroud)

所以我认为COPY . .首先检查.dockerignore ..不?

the*_*pan 21

我一直在努力解决这个问题,直到我看到这篇文章,它帮助我了解了我的案例中发生的事情。如果您将所有内容绑定到容器,例如.:/app,或者.:/usr/src/app在热重载的开发过程中很常见,我们将完全忽略.dockerignore,因为绑定安装是在构建映像后附加的,甚至被忽略的文件现在也安装到容器中。我删除了绑定,并且.dockerignore忽略了指定的文件。

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

  • 我也遇到过同样的问题。问题如此明显却又很难发现。 (2认同)
  • 遇到同样的问题,我大概花了3个小时调试。我最终通过 SSH-d 进入 Docker 容器,最终意识到“node_modules”不在那里,尽管它应该在那里。不过,感谢您的评论,经过几个小时的谷歌搜索,这是第一个最终解释了我的问题的评论。 (2认同)

h-r*_*rai 6

.dockerignore需求是在根目录/文件夹的情况下,你在指定的docker-compose.yml


gra*_*pes 5

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

我猜您假设这些文件适用于docker文件夹,但实际上它们分别适用于docker/appdocker/web

构建过程如下:

首先docker cli打包上下文(Dockerfile如果未明确指定,则带有文件夹),并将其发送给docker daemon。此文件夹之外的任何内容均不会发送。它是为COPY命令显式编写的,用于将上下文项放入容器中:

src路径必须构建的上下文中; 您无法复制../something / something,因为Docker构建的第一步是将上下文目录(和子目录)发送到docker守护程序。

如果存在.dockerignore,则打包之前将排除被忽略的文件。


fgu*_*len 5

对我有用的是将 放在.dockerignore我的应用程序的根目录下docker-compose.yml