我在这里有完整的示例存储库:
https://github.com/devinrsmith/docker-compose-build-test
如果我错误地使用了docker-compose build
,请告诉我!
您的文件格式有问题。
在.dockerignore
将subdir/
更改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遇到了同样的问题:
听起来我们.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 build
和docker-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
复制了所有内容
.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)
,但该错误仍然存在。
我正在使用:
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
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以及下面的所有用户很多时间。
用户误解了当前文档
只是想为此问题+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 info
和docker version
步骤,它是否显示要安装的正确(19.03.x)版本的Docker?
这是https://travis-ci.org/LocoDelAssembly/docker-compose-dockerignore/builds/658435194
$ 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 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
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 :
这里也有同样的问题, .dockerignore
在docker-compose
中无法可靠运行
最有用的评论
为什么.dockerignore可用于
docker build -t subdir ../
但不能用于docker-compose build
?