Dockerignore:忽略除文件和Dockerfile之外的所有内容

Row*_*nto 55 docker

所以主要目的是将胖jar应用程序停靠并放入Elasticbeanstalk.问题在于背景.如果我需要的只是一个jar文件,那么在docker中添加如此多的上下文有点愚蠢.

我一直在玩.dockerignore文件,但我迷路了.我试图使用gitignore否定,但它不起作用.

*
!Dockerfile
*/
!target/
target/*
!target/*.jar
Run Code Online (Sandbox Code Playgroud)

还有正则表达式的东西,但似乎不支持复杂的正则表达式.

^((?!Dockerfile).)*$
Run Code Online (Sandbox Code Playgroud)

我也试过在stackoverflow中搜索,这两个都是我找到的:

这个问题可能与第二个问题类似,但我认为这有点不同,因为在这里,我只想在上下文中包含一个文件.

任何帮助将不胜感激.

Mau*_*hez 74

如果您需要忽略除某些目录或文件之外的所有内容,并且还忽略这些允许目录中的一些不必要的文件,则可以使用以下.dockerignore文件:

# Ignore everything
**

# Allow files and directories
!/file.txt
!/src/**

# Ignore unnecessary files inside allowed directories
# This should go after the allowed directories
**/*~
**/*.log
**/.DS_Store
**/Thumbs.db
Run Code Online (Sandbox Code Playgroud)

  • 为什么是`!/src/**`而不是`!/src`? (3认同)
  • 根据[Docker文档](https://docs.docker.com/engine/reference/builder/#dockerignore-file),仅在第一行放置*即可(而不是**)就足够了。 。引用:“您可能要指定要包含在上下文中的文件,而不是要排除的文件。要实现此目的,请指定`*`作为第一个模式,然后指定一个或多个`!`异常模式。 (2认同)

abr*_*und 31

dockerfile引用:

除了Go的filepath.Match规则,Docker还支持一个特殊的通配符字符串**,它匹配任意数量的目录(包括零).例如,**/*.go将排除在所有目录中找到的以.go结尾的所有文件,包括构建上下文的根.

因此,只包含**的行将忽略与Dockerfile相同的目录中的所有内容.

正如预期的那样,感叹号可用于引用您希望发送到docker守护程序的任何文件.

  • `**` 放在文件的顶部是非常重要的,否则排除将被忽略。Docker 使用最后一个匹配的规则作为“最终”规则,所以如果 `**` 是最后一个,它将匹配所有内容。 (3认同)
  • 所以如果 `foo` 是你想要包含的唯一文件,那么在第一行添加 `**`,在下一行添加 `!foo`。 (3认同)

Jay*_*son 9

这可能听起来很奇怪,但如果您只需要一个jar文件,则可以在构建系统中创建一个包含Dockerfile的"docker"文件夹.运行构建时,让构建脚本将单个jar文件复制到"docker",然后执行docker image build(从"docker"文件夹中)并在完成后推送到docker注册表.

  • 嗨,这听起来并不奇怪.我认为这是一种普遍的做法,但如果可能的话,我正在寻找一种方法来使用.dockerignore.另外,我真的不喜欢mvn xml :) (2认同)