Compose: docker-compose构建忽略.dockerignore?

创建于 2015-06-26  ·  100评论  ·  资料来源: docker/compose

我在这里有完整的示例存储库:

https://github.com/devinrsmith/docker-compose-build-test

如果我错误地使用了docker-compose build ,请告诉我!

arebuild kinbug

最有用的评论

为什么.dockerignore可用于docker build -t subdir ../但不能用于docker-compose build

所有100条评论

您的文件格式有问题。

.dockerignoresubdir/更改subdir

为什么.dockerignore可用于docker build -t subdir ../但不能用于docker-compose build

我在运行docker-compose 1.2.0时遇到相同的问题。
运行香草docker build会提取忽略文件并在其中构建映像np。
但是,无论是否带有斜杠,docker-compose都不使用忽略文件。

看起来像是docker-py问题; https://github.com/docker/docker-py/pull/604中正在修复此问题

@aanand看起来像https://github.com/docker/docker-py/pull/604停滞了,并从那里的里程碑中删除了?

@thaJeztah我创建了https://github.com/docker/docker-py/pull/721以继续工作。

你好

我面临着.dockerignore的一个奇怪问题:

*.sh

!awesome/script.sh

使用docker build一切都很好,但是docker-compose没看到“ awesome / script.sh”

我在同一问题上吗?

@twillouer是一个已知的错误,已由https://github.com/docker/docker-py/pull/721修复-它将在1.5.0版的Compose端修复。

谢谢 !

即使在某些机器上使用最新的git master,这似乎仍然被破坏。 给定此配置的机器上,它对我不起作用:

Debian 8.2带有内核3.16.0,带有lxc-docker版本1.7.1,内部版本786b29d
docker-compose是git master,HEAD在dabf1e8657674014a5bc89f99edbf2fe0629bb71

.dockerignore适用于docker build(可立即运行),但不适用于docker-compose(用于上传不应在数分钟内上传的内容)。

另请参阅#2100

我有同样的问题。 docker-compose忽略“ .dockerignore”。 “ docker build”工作正常。
系统:Windows 10

我使用昨天发布的Docker Toolbox遇到了同样的问题:

  • Windows 7 x64
  • Docker版本1.9.0,内部版本76d6bc9
  • Docker-Compose 1.5.0

听起来我们.dockerignore仍然有问题。 如果您在撰写1.5.0时遇到这些问题,请提供示例.dockerignore和目录结构,以便我们重现该错误。

抱歉,没有提供较小的用例,但这是我注意到问题的方式:

我的项目有package.json

{
  "dependencies": {
    "grunt-contrib-uglify": "^0.9.2"
  }
}

另外,我有这个docker-compose.yml

web:
  build: .

Dockerfile看起来像这样:

FROM node:0.12

我的.dockerignore包含一行(我尝试添加尾部斜杠,但问题仍然存在):

node_modules

现在我可以做

> npm install
  (...snip...)
> docker build .
Sending build context to Docker daemon  5.12 kB

太棒了,它有效,只发送了5 KiB( node_modules总共大约是10 MiB)。 在docker-compose中有Q:\sites\test

> npm install
  (...snip...)
> docker-compose up
Building web
Traceback (most recent call last):
  File "D:\opt\python\Scripts\docker-compose-script.py", line 9, in <module>
    load_entry_point('docker-compose==1.5.0dev', 'console_scripts', 'docker-compose')()
  File "D:\opt\python\lib\site-packages\compose\cli\main.py", line 54, in main
    command.sys_dispatch()
  File "D:\opt\python\lib\site-packages\compose\cli\docopt_command.py", line 23, in sys_dispatch
    self.dispatch(sys.argv[1:], None)
  File "D:\opt\python\lib\site-packages\compose\cli\docopt_command.py", line 26, in dispatch
    self.perform_command(*self.parse(argv, global_options))
  File "D:\opt\python\lib\site-packages\compose\cli\main.py", line 170, in perform_command
    handler(project, command_options)
  File "D:\opt\python\lib\site-packages\compose\cli\main.py", line 583, in up
    detached=detached
  File "D:\opt\python\lib\site-packages\compose\project.py", line 313, in up
    detached=detached
  File "D:\opt\python\lib\site-packages\compose\service.py", line 404, in execute_convergence_plan
    container = self.create_container(do_build=do_build)
  File "D:\opt\python\lib\site-packages\compose\service.py", line 303, in create_container
    self.ensure_image_exists(do_build=do_build)
  File "D:\opt\python\lib\site-packages\compose\service.py", line 326, in ensure_image_exists
    self.build()
  File "D:\opt\python\lib\site-packages\compose\service.py", line 718, in build
    dockerfile=self.options.get('dockerfile', None),
  File "D:\opt\python\lib\site-packages\docker\api\build.py", line 48, in build
    context = utils.tar(path, exclude=exclude, dockerfile=dockerfile)
  File "D:\opt\python\lib\site-packages\docker\utils\utils.py", line 85, in tar
    t.add(os.path.join(root, path), arcname=path, recursive=False)
  File "D:\opt\python\lib\tarfile.py", line 1998, in add
    tarinfo = self.gettarinfo(name, arcname)
  File "D:\opt\python\lib\tarfile.py", line 1870, in gettarinfo
    statres = os.lstat(name)
WindowsError: [Error 3] Das System kann den angegebenen Pfad nicht finden: 'Q:\\sites\\test\\node_modules\\grunt-contrib-uglify\\node_modules\\maxmin\\node_modules\\pretty-bytes\\node_modules\\meow\\node_modules\\normalize-package-data\\node_modules\\validate-npm-package-license\\node_modules\\spdx-correct\\node_modules\\spdx-license-ids\\spdx-license-ids.json'

(我在这台机器上使用的是1.5.0dev,但是在另一台1.5.0最终版的机器上却遇到了完全相同的问题)。

使用node时,我经常在Windows上遇到路径和内容太长的问题,但是Docker-Compose尝试对node_modules进行压缩的事实表明.dockerignore被忽略了。

FWIW,在docker-compose 1.5.0dev的Linux(Ubuntu)上,我仍然遇到这个问题,因此它可能不孤立于Windows。 但是,它在生产机器上,所以我不能轻松地组合一个最小的测试用例(在我的测试机器上可以正常工作)。

我也有这个问题。

目录结构:

docker-compose.yml
web
  + .dockerignore
  + Dockerfile
  + node_modules
    + ...

docker-compose.yaml

web:
  build: web
  tty: true
  ports:
    - 8081:5000

Docker文件

FROM microsoft/aspnet

# Curl, node, npm, bower, grunt
RUN apt-get update && apt-get install -y curl
RUN curl -sL https://deb.nodesource.com/setup | bash -
RUN apt-get install -y nodejs
RUN npm install -g bower
RUN npm install -g grunt-bower-cli
RUN npm install -g grunt
RUN npm install -g grunt-cli
RUN npm install -g grunt-bower-task

# Copy the project.json file first, then do a restore.
# This ensures that as long as project.json doesn't change, it will avoid
# doing a package restore
COPY project.json /app/
COPY bower.json /app/
COPY gruntfile.js /app/
COPY package.json /app/
WORKDIR /app

RUN ["dnu", "restore"]

# Then copy the rest of the files
COPY . /app

# Expose the port that the website listens on
EXPOSE 5000
# And start the website
ENTRYPOINT ["dnx", "-p", "project.json", "web"]

.dockerignore

node_modules

结果:

Pi<strong i="19">@Ricci</strong> MINGW64 /d/proj/Repro
$ docker-compose build
Building web
Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "C:\projects\compose\compose\cli\main.py", line 54, in main
  File "C:\projects\compose\compose\cli\docopt_command.py", line 23, in sys_dispatch
  File "C:\projects\compose\compose\cli\docopt_command.py", line 26, in dispatch
  File "C:\projects\compose\compose\cli\main.py", line 171, in perform_command
  File "C:\projects\compose\compose\cli\main.py", line 192, in build
  File "C:\projects\compose\compose\project.py", line 235, in build
  File "C:\projects\compose\compose\service.py", line 683, in build
  File "c:\projects\compose\venv\lib\site-packages\docker\api\build.py", line 48, in build
  File "c:\projects\compose\venv\lib\site-packages\docker\utils\utils.py", line 85, in tar
  File "c:\python27-x64\Lib\tarfile.py", line 2000, in add
  File "c:\python27-x64\Lib\tarfile.py", line 1872, in gettarinfo
WindowsError: [Error 3] The system cannot find the path specified: 'D:\\proj\\Repro\\web\\node_modules\\babel-preset-react\\node_modules\\babel-plugin-transform-react-jsx\\node_modules\\babel-helper-builder-react-jsx\\node_modules\\babel-types\\node_modules\\babel-traverse\\node_modules\\babel-code-frame\\node_modules\\js-tokens\\changelog.md'
docker-compose returned -1

+1

有人找到解决方法了吗? 我正在尝试仅在Dockerfile中执行所有操作,但是还没有任何运气。

我也遇到了这个问题,这可能与每个人都在运行的节点版本有关吗? 通过这个问题: https :

同样,尽管这显然被忽略了,但我也在Linux机器上看到了这一点。

我通过在docker-compose文件中删除不必要的卷参考来解决此问题。 Compose将忽略.gitignore的卷。

我还必须升级我的应用程序以使用npm 3+ ..但这仅适用于Windows用户。

@ esc-rtn .dockerignore文件仅指定在_build_期间不应将哪些文件发送到守护程序。 如果在“运行”期间使用绑定安装的卷,它将仅将该位置上的所有文件作为卷安装(主机上存在的所有文件)。

我在Windows上也看到了类似的情况: docker build可以按预期工作, docker-compose不能正常工作。

我在GitHub上放了一个小例子,在README.md中有注释: https :

Compsoe 1.5.2发布后,对.dockerignore另一轮修复进入了docker-py。 您能否试用Compose 1.6.0 RC2版本,看看现在是否已解决?

刚尝试使用docker-compose版本1.6.0rc2,构建a7636be。

我的回购中有三个测试用例,而在1.5.2中,其中两个失败了。 现在使用1.6.0rc2时,只有一个失败,当我在目录中排除了目录和文件时,如下所示:

$ cat .dockerignore
files/test_dir
!files/test_dir/should_be_here_maybe

在这种情况下,我在docker builddocker-compose build之间得到相同的行为。

.dockerignore

files/test_dir
!files/test_dir/should_be_here_maybe

docker-compose.yml

test:
  build: .

Dockerfile

FROM busybox
COPY . /context
CMD ["find", "/context"]
$ docker version
Client:
 Version:      1.10.0-rc1
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   677c593
 Built:        Fri Jan 15 18:17:17 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.10.0-rc1
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   677c593
 Built:        Fri Jan 15 18:17:17 2016
 OS/Arch:      linux/amd64

$ docker-compose version
docker-compose version 1.6.0rc2, build 695c692
docker-py version: 1.7.0-rc3
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1j 15 Oct 2014

$ mkdir -p files/test_dir
$ touch files/test_dir/should_be_here_maybe

$ find .
.
./.dockerignore
./docker-compose.yml
./Dockerfile
./files
./files/test_dir
./files/test_dir/should_be_here_maybe

$ docker build --no-cache -t 1607-docker-build .
Sending build context to Docker daemon  5.12 kB
Step 1 : FROM busybox
 ---> 0cb40641836c
Step 2 : COPY . /context
 ---> 859e12600100
Removing intermediate container 9067b263098b
Step 3 : CMD find /context
 ---> Running in 1ddc0a573492
 ---> b1b3beacf5f2
Removing intermediate container 1ddc0a573492
Successfully built b1b3beacf5f2

$ docker run 1607-docker-build
/context
/context/docker-compose.yml
/context/Dockerfile
/context/files
/context/files/test_dir
/context/files/test_dir/should_be_here_maybe
/context/.dockerignore

$ docker-compose build --no-cache
Building test
Step 1 : FROM busybox
 ---> 0cb40641836c
Step 2 : COPY . /context
 ---> d86507051d6d
Removing intermediate container 0af2cbf69b17
Step 3 : CMD find /context
 ---> Running in 8533dae3af74
 ---> 1f736ecb2b38
Removing intermediate container 8533dae3af74
Successfully built 1f736ecb2b38

$ docker-compose run test
/context
/context/docker-compose.yml
/context/Dockerfile
/context/files
/context/files/test_dir
/context/files/test_dir/should_be_here_maybe
/context/.dockerignore

@aanand ,您好,谢谢您的回复,按照您的步骤进行操作,我得到的结果是相同的。

但是,我之前运行的测试在files / test_dir中也存在另一个文件。 如果我将另一个文件添加到files / test_dir,那么我看到它与docker build不存在(正如我期望的那样),但与docker-compose

$ touch files/test_dir/should_not_be_here

$ docker build --no-cache -t 1607-docker-build .
Sending build context to Docker daemon  5.12 kB
Step 1 : FROM busybox
 ---> b175bcb79023
Step 2 : COPY . /context
 ---> a23d9645c21c
Removing intermediate container 8eb2bb23c4db
Step 3 : CMD find /context
 ---> Running in d9fef847acd8
 ---> e52ae84b1250
Removing intermediate container d9fef847acd8
Successfully built e52ae84b1250
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

$ docker run --rm 1607-docker-build
/context
/context/Dockerfile
/context/files
/context/files/test_dir
/context/files/test_dir/should_be_here_maybe
/context/docker-compose.yml
/context/.dockerignore

$ docker-compose build --no-cache
Building test
Step 1 : FROM busybox
 ---> b175bcb79023
Step 2 : COPY . /context
 ---> 9df0cf4bfb69
Removing intermediate container 7820f982d59e
Step 3 : CMD find /context
 ---> Running in 06e1a0b89a45
 ---> 2c922dbc66d9
Removing intermediate container 06e1a0b89a45
Successfully built 2c922dbc66d9

$ docker-compose run test
ERROR: Interactive mode is not yet supported on Windows.
Please pass the -d flag when using `docker-compose run`.

$ docker-compose run -d test
dcitest_test_run_2

$ docker logs dcitest_test_run_2
/context
/context/Dockerfile
/context/files
/context/files/test_dir
/context/files/test_dir/should_not_be_here
/context/files/test_dir/should_be_here_maybe
/context/docker-compose.yml
/context/.dockerignore

这是Windows(使用git bash作为我的外壳),并已与docker compose 1.5.2和1.6.0rc2,docker 1.9.1进行了检查。

在具有docker-compose 1.5.2和docker 1.9.1的Ubuntu 14.04上运行相同的命令是可以的:

# cat .dockerignore
files/test_dir
!files/test_dir/should_be_here_maybe

# find .
.
./.dockerignore
./docker-compose.yml
./files
./files/test_dir
./files/test_dir/should_not_be_here
./files/test_dir/should_be_here_maybe
./Dockerfile

# docker-compose build --no-cache
Building test
Step 1 : FROM busybox
 ---> b175bcb79023
Step 2 : COPY . /context
 ---> c533a0768d5e
Removing intermediate container 0c057fe8eb82
Step 3 : CMD find /context
 ---> Running in e8a0cf1f58d8
 ---> 175777486a25
Removing intermediate container e8a0cf1f58d8
Successfully built 175777486a25

# docker-compose run test
/context
/context/docker-compose.yml
/context/.dockerignore
/context/files
/context/files/test_dir
/context/files/test_dir/should_be_here_maybe
/context/Dockerfile

整个下午大部分时间仍在处理。

Docker版本1.10.1,内部版本9e83765
docker-compose版本1.6.0,构建d99cad6

#docker-compose.yml
test:
  build: ./cdn
#Dockerfile
FROM busybox
COPY ["content/","/test/"]
RUN find /test/ -maxdepth 1
#.dockerignore
**/.DS_Store
**/.git
**/.bowerrc
**/bower_components
**/node_modules
**/npm-debug.log

docker build .输出与预期的一样

docker-compose build --no-cache test复制了所有内容

2992还有更多.dockerignore修复程序,应包含在1.6.1中

感谢@ shin-,不幸的是,我仍然从Windows的Docker Toolbox中看到docker-compose 1.6.2的不同行为:

$ docker-compose --version
docker-compose version 1.6.2, build e80fc83

$ find .
.
./.dockerignore
./docker-compose.yml
./Dockerfile
./files
./files/test_dir
./files/test_dir/should_be_here_maybe
./files/test_dir/should_not_be_here

$ cat .dockerignore
files/test_dir
!files/test_dir/should_be_here_maybe

$ docker-compose build --no-cache
Building test
Step 1 : FROM busybox
latest: Pulling from library/busybox
f810322bba2c: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:97473e34e311e6c1b3f61f2a721d038d1e5eef17d98d1353a513007cf46ca6bd
Status: Downloaded newer image for busybox:latest
 ---> 3240943c9ea3
Step 2 : COPY . /context
 ---> 85a65d7f861c
Removing intermediate container 386d3103d8ab
Step 3 : CMD find /context
 ---> Running in e5e29b5746c4
 ---> 2c2d57a899ea
Removing intermediate container e5e29b5746c4
Successfully built 2c2d57a899ea

$ docker-compose run -d test
dcitest_test_run_1

$ docker logs dcitest_test_run_1
/context
/context/Dockerfile
/context/files
/context/files/test_dir
/context/files/test_dir/should_be_here_maybe
/context/files/test_dir/should_not_be_here
/context/.dockerignore
/context/docker-compose.yml

真奇怪它绝对对我有用。

$ docker-compose build --no-cache
Building web
Step 1 : FROM busybox
 ---> 3240943c9ea3
Step 2 : COPY . /context
 ---> 3619871879ad
Removing intermediate container 08432f688579
Step 3 : CMD find /context
 ---> Running in 5bbcf987c9e7
 ---> cf2bff2c1416
Removing intermediate container 5bbcf987c9e7
Successfully built cf2bff2c1416

$ docker-compose run -d web
Creating network "testdockerignore_default" with the default driver
testdockerignore_web_run_1

$ docker logs testdockerignore_web_run_1 
/context
/context/Dockerfile
/context/files
/context/files/test_dir
/context/files/test_dir/should_be_here
/context/docker-compose.yml
/context/.dockerignore

$ find .
.
./Dockerfile
./files
./files/test_dir
./files/test_dir/should_not_be_here
./files/test_dir/should_be_here
./docker-compose.yml
./.dockerignore

$ cat .dockerignore files/test_dir
!files/test_dir/should_be_here

您的环境中pip show docker-py的输出是什么?

我相信我也有同样的问题。

 Docker build .

为我工作。 但是,将同一内部版本包含在docker-compose.yml文件中会破坏我的内部版本。 在我的.dockerignore文件中,我不包含用于节点构建的node_modules目录。 这是我的docker-compose.yml中的相关部分:

web:
  build: ./app
  ports:
    - "8080:8080"
  links:
    - mongodb

我相信我正在运行最新版本的docker-compose:

>docker-compose version
docker-compose version 1.6.2, build e80fc83
docker-py version: 1.7.2
CPython version: 2.7.11
OpenSSL version: OpenSSL 1.0.2d 9 Jul 2015

我正在运行Windows 10 x64。

特定于Windows的问题,也许是路径分隔符?

不知道如何分辨这是否与路径分隔符有关。

让我知道我是否可以协助测试。 现在,我有一个批处理文件,可以在构建之前将“忽略的”文件夹移出项目目录,这显然很丑陋。

谢谢你的帮助。

为了完整起见,这是我的.dockerignore文件:

**/node_modules

啊哈! 导致问题的原因是全局模式。 删除“ ** /”对我来说解决了这个问题。

尽管我有针对特定问题的解决方法,但事实仍然是存在错误。 至少,全局模式** /不能用docker-compose正确解析,但可以与常规docker build命令一起正常工作。 其他全局模式可能会也可能不会起作用。

@bfirsh和其他可能在乎的人:

我有一个绝对简单的.dockerignore,它看起来像这样:

livedata
readonly-data

.dockerignore也不起作用(构建上下文文件夹中的这两个文件夹上载到守护程序,并且需要_forever_),并且我在Linux上。 我已更新为最新的1.6.2,没有更改。 除非遇到相同症状的其他问题,否则让我再次重申_这似乎不是Windows特定的问题。

+1,在Linux上对我来说也很麻烦-不要认为这是Windows特有的问题。

@JonasT @nicbarker您如何确认以.dockerignore命名的文件夹正在上传,而不是花费很长时间? 如果您有办法检查tarball,我想尝试并使用它在本地重现问题。 实际上,我已经向docker-py添加了一些调试功能,但仍然无法复制:

$ pip list | grep docker
docker-compose (1.7.0.dev0, /Users/aanand/work/docker/compose)
docker-py (1.8.0rc2, /Users/aanand/work/docker/docker-py)

$ find .
.
./.dockerignore
./docker-compose.yml
./Dockerfile
./include.txt
./livedata
./livedata/exclude.txt
./readonly-data
./readonly-data/exclude.txt

$ cat .dockerignore
livedata
readonly-data

$ cat Dockerfile
FROM busybox
COPY . /data

$ docker-compose --verbose build --no-cache
<unrelated output>
docker.utils.utils.tar: Writing tar file to <open file '<fdopen>', mode 'w+b' at 0x1090f26f0>
docker.utils.utils.tar:   Adding .dockerignore
docker.utils.utils.tar:   Adding Dockerfile
docker.utils.utils.tar:   Adding docker-compose.yml
docker.utils.utils.tar:   Adding include.txt
docker.utils.utils.tar: Done
<unrelated output>

@aanand开始之前要花很长时间,当我将Dockerfile移至./context并使用“ build:./context/”而没有其他更改时,它立即变得非常快。 还是在那时,当这个问题第一次出现时,我尝试使用“ docker build”手动尝试构建docker build,它也是即时的。

那并不能真正确认问题。 如果项目根目录中还有另一个大目录,则将构建移至./context可以使其更快。

@dnephin除了“上下文”本身和三个小文本文件外,这里没有其他文件夹,除了“上下文”本身(我将其作为一种解决方法)。

@JonasT是否有可能包含一个较大的.git目录?

编辑:NVM,似乎我实际上愚蠢到错过一个目录,因为我检查了错误的rsync'ed复制>。>抱歉。

我在较早的docker-compose版本上确实有这个问题,我对此进行了更深入的调查,但也许我实际上已经通过一些最新的dockerpy更新修复了该特定实例。

回到这是Windows问题吗? :)

你好
我有linux,撰写1.6.2,docker 1.10.3 ...完全一样的问题。 docker使用.dockerignore ,compose会忽略它。

@ulrichSchreiner您可以提供复制步骤吗?

你好

这是要点(https://gist.github.com/ulrichSchreiner/566815cea26ce55b95207e7795cf6962)。 .dockerignore包含**/node_modules Dockerfile在t1/a/b/c/node_modules子文件夹中添加一个文件。

如果使用“ docker build ...”进行构建,则会出现错误,因为没有要添加的文件(由于.dockerignore中的模式而被正确忽略)。 您可以在要点的最后一个文件中看到输出。

但是,如果使用给定的“ docker-compose.yml”构建它,则可以成功构建-> docker-compose将忽略.dockerignore文件。

当您的node_modules目录为数百兆时,这真的很痛苦....

我用

docker-compose version 1.6.2, build 4d72027

好,我可以重现这一点。 似乎docker-py的**/规则可能有一个错误。

IIRC,缺少对**语法的支持是我们的.dockerignore实现的已知限制。 参见https://github.com/docker/docker-py/pull/721#issuecomment -135065043

这里同样的问题。 与docker-compose结合使用时会忽略.dockerignore
docker-compose version 1.6.2, build 4d72027 OSX

./.dockerignore
./Dockerfile (symlink to ./server/docker/cms/Dockerfile)
./server/docker/docker-compose.yml

.dockerignore的内容

./.git
./.vagrant

.vagrant是16GB,因此对我们来说这是一个“大笔交易”。

抱歉,

docker-machine version 0.7.0, build a650a40

docker-compose version 1.7.0, build 0d7bf73
docker-py version: 1.8.0
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1j 15 Oct 2014

Client:
 Version:      1.11.1
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   5604cbe
 Built:        Tue Apr 26 23:44:17 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.11.1
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   5604cbe
 Built:        Wed Apr 27 00:34:20 2016
 OS/Arch:      linux/amd64

@lattwood看起来像个https://github.com/docker/docker-py/pull/1065中修复了它./ ,它应该可以工作。

谢谢!

在Ubuntu 14.04上运行,我的dockerignore只是**/always_restart.txt 。 在常规docker build (v1.11.2)上,我看不到容器中的文件,但是使用Compose(v1.7.1),我可以看到。

Edit1:好像docker-py不能测试双星号表示法,我想也可能不会处理它: https :

Edit2:使用*/tmp/always_restart.txt可与Compose配合使用,因此**模式将被忽略

@ agilgur5正确,这是https://github.com/docker/docker-py/issues/1117进行跟踪。

我们在DOCKERFILE中的丑陋解决方法:
使用git-check-ignore进行解析(因此需要git init ),我们只是删除在复制后应忽略的所有内容。
请注意,在我们的情况下,必须毕竟是COPY s(或ADD s),否则我们又会得到不需要的文件。

RUN mkdir /app/
WORKDIR   /app/
# ...
# all the COPYs
# ...
RUN git init
COPY ./.dockerignore /app/
RUN mv .dockerignore .gitignore
RUN DEL_ME=$(find . -print0 | xargs -0) && echo Forcing deletion of .dockerignore files && git check-ignore --no-index $DEL_ME > tmp.txt
RUN DEL_ME=$(cat tmp.txt | xargs) && echo DELETING: $DEL_ME tmp.txt && rm -f -d -r $DEL_ME tmp.txt

也要从.gitignore中删除文件(因为为什么不这样)

COPY ./.gitignore      /app/
COPY ./.dockerignore   /app/
RUN DEL_ME=$(find . -print0 | xargs -0) && echo gitignore && git check-ignore --no-index $DEL_ME > tmp.txt
RUN rm .gitignore && mv .dockerignore .gitignore
RUN DEL_ME=$(find . -print0 | xargs -0) && echo dockerignore && git check-ignore --no-index $DEL_ME >> tmp.txt
RUN DEL_ME=$(cat tmp.txt | xargs) && echo DELETING: DEL_ME tmp.txt && rm -f -d -r $DEL_ME tmp.txt

我认为通过在docker-compose.yml使用数据量,通过基本上列出不想覆盖的容器目录,找到了一种解决方法。 在我们的例子中,我们想在容器中保留node_modules目录。

因此,我们的docker-compose.yml看起来像这样:

  my_app:
    build: ./my_app
    volumes:
      - ./my_app:/app
      # prevent the mounting above from overwriting the following
      - /app/node_modules

volumes值确实重复了.dockerignore但现在让我们开始...

对于这个问题,我有一个高层次的建议:

我建议将此问题淘汰为“ [元问题] :. dockerignore规则的不正确处理”(或“ [跟踪问题]:不正确的处理...”),或者直接关闭此问题以利于收集更小,更可行的问题。 这是因为(1)并不是Docker compose会“忽略” .dockerignore文件(这就是问题标题当前所说的)。 它只是没有正确地执行规则。 (2),这个问题有很多部分。 这不仅仅是一个问题。 例如,有一个**处理中)和我刚刚提交的这个新的(最后一行优先级)。 而且可能还有更多。

因为此问题线程很长(因为它涵盖了广泛的问题区域),所以需要解决的单个问题很难在线程中定位。 与一般的“ .dockerignore似乎不起作用”问题相反,我建议提交可以单独解决的定义明确的问题。 按照目前的说法,这个问题可能永远也不会解决,因为Python实现可能永远不会与参考实现保持一致。

我用过**/**/node_modules但发现这没用。 因此,我在子项目中定义了每个node_modules目录来修复此错误。

在此修补程序之前,我在安装npm依赖项时遇到了“访问权限错误”,因为它们已经存在(由于使用无效的dockerignore文件进行复制而导致)。

同样的问题。

macOS Sierra 10.12.2
Docker版本1.12.5,内部版本7392c3b
docker-compose版本1.9.0,内部版本2585387

**模式问题应在1.11.2中修复
可能存在一些未解决的问题,例如具有最后一行优先级的问题,在#3931和#3886中分别进行了跟踪。 请参阅那些以获取更多更新。

我不确定docker-compose是否忽略了我的.dockerignore还是未能正确解释它(与docker正常工作不同)。 这就是我降落在这里的方式: http :

这是我的.dockerignore文件(以防您发现问题所在):

$ cat .dockerignore 
*
!www
!app
!inc
*/node_modules
*/bower_components
**/*.log
**/Dockerfile
**/.gitignore

我的docker-compose build似乎完全忽略了.dockerignore文件。
docker build可以正常工作。

$ docker-compose version                                                                                                                       
docker-compose version 1.14.0, build c7bdf9e
docker-py version: 2.3.0
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

我的.dockerignore看起来像这样

.bundle
.git
.gitignore
test
tmp
log

所以这里没什么特别的。
我正在使用Ubuntu 16.04,但我不知道这是否重要。

顺便说一句:有人可以解释一下,为什么docker-compose build不使用与docker build相同的代码来使用Dockerfile和所有其他东西来构建图像吗? 为什么会有明显的代码重复(此问题所显示的效果确实不好)?

为什么关闭此问题,我们如何重新打开它? 该软件显然已损坏,需要修复

啊。 谢谢你。 很高兴它将得到解决

我已经阅读了建议的问题#3931和#3886,但是我的.dockerignore不是特殊的,因此我无法准确地映射我的问题。
我根本不为我工作,也没关系,.dockerignore中的内容。

太愚蠢了,这是我的错误。:dizzy_face:
我将代码安装为一个卷,因此很明显,没有什么被忽略。 抱歉

app:
  build: .
  container_name: my_app
  volumes:
    - .:/my_app

这似乎尚未解决?

version: '3.4'
services:
  ui:
    build:
      context: ./source/ui
      dockerfile: Dockerfile
      target: development
    command: bash -c "yarn dev"
    ports:
      - '9091:9091'
      - '9092:9092'
    expose:
      - '9091'
      - '9092'
    volumes:
      - ./source/ui:/app
      - node-modules:/app/node_modules

    environment:
      - PORT=9091
      - HMR_PORT=9092
      - NODE_ENV=development
      - API_HOST=api.docker:7001

volumes:
  node-modules:

in source/ui/.dockerignore:

node_modules
dist
```

但是两个文件夹最终还是被创建了...

我有同样的问题。 当我注意到我使用的是旧的撰写版本时。 已更新为docker-compose version 1.22.0-rc1, build e7de1bc3

问题是debian / ubuntu附带的compose版本太旧了。

现在它可以更好地工作了,但仍然不像docker build

这仍然没有解决。 运行Docker for Mac,最新版本(Docker 18.03.1-ce-mac65)。

我的.dockerignore:

**/package-lock.json
**/node_modules

但是在使用docker-compose时,两者都会传递到容器中。

https://github.com/docker/docker-py/pull/2065在1.22.0 RC2中,应该解决该问题。

我正在使用Docker for Mac版本18.06.1-ce-mac73 (26764) ,但该错误仍然存​​在。

image

我正在使用:

docker-compose版本1.22.0,内部版本f46880f
Docker版本18.06.1-CE,内部版本e68fc7a

在Ubuntu 16.04 Xenial和docker-compose上运行的版本会忽略以下.dockerignore:

**/*.jpg **/*.png **/*.pyc **/*.solverstate **/*.caffemodel **/*.tgz **/.pytest_cache **/*__pycache__* **/.git **/node_modules *.egg-info .eggs *Dockerfile* build dist
由于现在应该解释双星号,所以我不知道是什么原因。 有人遇到同样的问题吗?

由于现在应该解释双星号,所以我不知道是什么原因。 有人遇到同样的问题吗?

我遇到了同样的问题( **/.tox )。

我遇到过同样的问题。 我使用不同的上下文。
docker-compose.yml放在应用程序的根路径上,看起来像

services:
  api:
    build:
      context: ./docker/api

我的文件树:

- app/
-- docker/
--- api/
---- .dockerignore <- it works!
-- docker-compose.yml
-- .dockerignore <- it does not work for contexts

祝你今天愉快!

@ zymtx5g79k这对我不起作用。

目录结构:

- .dockerignore
- docker/
-- development/
--- docker-compose.yml  

docker-compose.yml

version: '3'
services:
  web:
    build:
      context: ../../.

@rodrigobdz ,请检查:
docker-compose.yml

services:
  api:
    build:
      context: ./../../
version: '3'

.dockerignore

/docker

文件结构

- docker/
-- api/
--- docker-compose.yml
- .dockerignore

结果还是一样,例如.git目录位于容器中。 我将在这里发布我的.dockerignore。 也许它本身有一些问题。

# Custom
docker-compose.yml
docs/
livereload.js*
yarn-error.log
v8-compile-cache-0
# vim
*.swp

.git
.gitignore
README.md

@rodrigobdz我无法重现该问题(运行docker compose版本1.22.0);

准备测试;

mkdir repro-1607 && cd repro-1607
mkdir -p docker/development/
mkdir -p ./.git/this-is-a-git-repo
echo "this is README.md" > README.md

cat > docker/development/docker-compose.yml -<<EOF
version: '3'
services:
  web:
    build:
      context: ../../.
EOF

cat > ./.dockerignore -<<EOF
# Custom
docker-compose.yml
docs/
livereload.js*
yarn-error.log
v8-compile-cache-0
# vim
*.swp

.git
.gitignore
README.md
EOF

cat > Dockerfile -<<EOF
FROM alpine
RUN apk add --no-cache tree
COPY . /foobar/
CMD tree -a /foobar/
EOF

使用docker-compose进行构建;

cd docker/development/
docker-compose build --no-cache

Building web
Step 1/4 : FROM alpine
 ---> 11cd0b38bc3c
Step 2/4 : RUN apk add --no-cache tree
 ---> Running in 8767bc07dad9
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
(1/1) Installing tree (1.7.0-r1)
Executing busybox-1.28.4-r0.trigger
OK: 5 MiB in 14 packages
Removing intermediate container 8767bc07dad9
 ---> 3916d3b689bb
Step 3/4 : COPY . /foobar/
 ---> 76ab68d75f88
Step 4/4 : CMD tree -a /foobar/
 ---> Running in 9891624b3cab
Removing intermediate container 9891624b3cab
 ---> d22b81d149f2
Successfully built d22b81d149f2
Successfully tagged development_web:latest

并确认未添加内容;

docker run --rm development_web:latest
/foobar/
├── .dockerignore
├── Dockerfile
└── docker
    └── development
        └── docker-compose.yml

2 directories, 3 files

现在,重命名.dockerignore并再次执行构建。

mv ../../.dockerignore ../../.dockerignore.disabled
docker-compose build --no-cache

Building web
Step 1/4 : FROM alpine
....

验证内容不再被忽略,并添加到图像中:

docker run --rm development_web:latest
/foobar/
├── .dockerignore.disabled
├── .git
│   └── this-is-a-git-repo
├── Dockerfile
├── README.md
└── docker
    └── development
        └── docker-compose.yml

4 directories, 4 files

(编辑:第一次运行的更新输出,因为我忘记了第一次使用-a运行tree

@thaJeztah感谢您抽出

我的用例类似于https://github.com/docker/compose/issues/2098#issue -108463351中描述的用例。 我在Dockerfile中使用COPY命令,此外,将同一目录挂载为volume

我期望.dockerignore的排除项将应用于该卷,如https://github.com/docker/compose/issues/2098#issuecomment -143505943中所述。

我期望.dockerignore中的排除项将应用于该卷,如#2098(注释)中所述。

不,在从主机绑定安装路径时,泊坞窗不会“居中”; 在Linux上,它实际上是从容器内的主机挂载该目录。 在Docker桌面(适用于Mac / Windows的Docker)上,还有其他一些“魔术”使这些文件在运行守护程序(和容器)的VM内部可用,但从本质上讲,其作用与之后的Linux相同。

.dockerignore仅在构建期间使用,用于加速构建; 以防止必须将映像中未使用/不需要的文件发送到守护程序。

感谢您的澄清! 我认为这种解释应该在文档中,以避免在社区中造成进一步的误解。 当前,文档主要集中于如何忽略文件,而不是.dockerignore本身的范围。

文档的该页面描述了Dockerfile和docker build ; 从这个角度来看; 想知道描述它不适用于其他命令/用途是否有意义。

好吧,如果这是造成误解的普遍根源,而且显然是这样,那么在那里提到它肯定是有意义的。

文档中的一句话可以节省我们@thaJeztah以及下面的所有用户很多时间


用户误解了当前文档

发行1607

1607

发行2098

2098

只是想为此问题+1。

我正在运行docker-copose:1.23.2(我在Homebrew和PIP之间可以找到的最新消息)
作业系统:Mac OS 10.14.2

生成时它仍然忽略我的.dockerfile。 同时必须明确复制内容。

我通过在docker-compose文件中删除不必要的卷参考来解决此问题。 Compose将忽略.gitignore的卷。

这已为我修复-docker-compose将忽略已安装卷中的.dockerignore文件。

@xvrqt在过去的一周中,我可能浪费了数小时,因为我的配置文件没有被正确复制(我的构建过程应该将其复制,但是由于未使用.dockerignore文件而被阻止),因此出现随机错误。 这有点令人难以置信。

感谢您强调这一点。

嗨! 这是什么状态? 我已经准备了非常简单的不涉及卷的docker-compose.yml方案,但是从远程git repo构建时,它无法拾取.dockerignore

https://github.com/LocoDelAssembly/docker-compose-dockerignore

我在master分支中遇到的错误是预期的吗? 除了使用香草泊坞窗构建和标记映像,然后在docker-compose.yml中使用映像之外,还有其他解决方案吗?

谢谢

除了使用香草泊坞窗构建和标记映像,然后在docker-compose.yml中使用映像之外,还有其他解决方案吗?

如果您正在运行当前版本的compose,则可以使用COMPOSE_DOCKER_CLI_BUILD=1 (和DOCKER_BUILDKIT=1 )选项使docker compose使用本机docker build

您的示例看起来与此处讨论的示例不同,因此打开新票证可能会很好(如果还没有)

谢谢@thaJeztah! 适用于COMPOSE_DOCKER_CLI_BUILD=1 ,但是如果我还添加DOCKER_BUILDKIT=1它将失败(由于不相关的原因)。

https://travis-ci.org/LocoDelAssembly/docker-compose-dockerignore/builds/658351109

嗯,我怀疑那是在那里运行的docker版本的错误; docker 18.06相当老了(和停产); 该版本的Docker的BuildKit版本相当早,但尚未稳定。

```
=>错误[内部]加载docker.io/library/alpine的元数据:3.9.5 0.1s
218 =>错误[1/5]来自docker.io/library/alpine:3.9.5 0.0s
219 => =>解析docker.io/library/alpine:3.9.5 0.0s
220 ------
221> [内部]加载docker.io/library/alpine:3.9.5的元数据:
222 ------
223 ------
224> [1/5]来自docker.io/library/ alpine:3.9.5
225 ------
226无法使用前端dockerfile.v0解决:无法构建LLB:无法加载缓存密钥:docker.io/library/ alpine:3.9.5未找到

哦,嗯,​​我看到您的travis也正在安装docker(从我的手机中读取); 可以取代预装版本吗? 如果在安装后添加docker infodocker version步骤,它是否显示要安装的正确(19.03.x)版本的Docker?

这是https://travis-ci.org/LocoDelAssembly/docker-compose-dockerignore/builds/658435194

概要

两种版本均失败的Docker版本

$ docker version
Client: Docker Engine - Community
 Version:           19.03.7
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        7141c199a2
 Built:             Wed Mar  4 01:22:36 2020
 OS/Arch:           linux/amd64
 Experimental:      false
Server: Docker Engine - Community
 Engine:
  Version:          19.03.7
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       7141c199a2
  Built:            Wed Mar  4 01:21:08 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

docker info输出有点大,因此不包括Server Version: 19.03.7

docker-compose版本

DOCKER_COMPOSE_VERSION = 1.26.0-rc2

$ docker-compose version
docker-compose version 1.26.0-rc1, build 07cab513
docker-py version: 4.2.0
CPython version: 3.7.6
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

(报告的版本是错误的,它是rc2,构建哈希与rc2匹配)

DOCKER_COMPOSE_VERSION = 1.25.4

$ docker-compose version
docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

该问题在19.03.8中仍然存在。

该问题在19.03.8中仍然存在。

正确。 还用最新的1.25和1.26 docker-compose版本更新了我的测试存储库,但所有操作仍如https://github.com/LocoDelAssembly/docker-compose-dockerignore中所述

可以在其中找到我上面粘贴的相同信息的构建: https :

这里也有同样的问题, .dockerignoredocker-compose中无法可靠运行

此页面是否有帮助?
0 / 5 - 0 等级