🎨
Docker
  • Docker入门
  • Docker overview
    • 隔离与限制
    • copy-on-write(CoW: 写时复制)
    • docker中的联合文件系统
    • Docker存储
      • tmpfs mounts
      • volume
      • bind mounts
    • Docker网络
      • host模式
      • bridge模式
        • default bridge模式
        • User-defined bridge模式
      • none模式
      • container模式
  • 容器监控方式
    • prometheus + grafana+cAdvisor监控容器
  • Dockerfile指令
    • Usage
    • BuildKit
    • Format
    • Parser directives
      • syntax
      • escape
    • Environment replacement
    • FROM
      • 了解ARG和FROM之间的交互方式
    • .dockerignore file
    • RUN
    • CMD
    • COPY
    • ADD
    • ENV
    • WORKDIR
    • ARG
      • Impact on build caching(对构建缓存的影响)
      • Default(默认值)
      • Scope(作用域)
      • Using ARG Variables(使用ARG变量)
      • Predefined ARGS(预先定义好的ARG变量)
      • Automatic platform ARGs in the global scope(全局作用域中自动化平台的ARGS)
    • STOPSIGNAL
    • HEALTHCHECK
    • SHELL
    • ONBUILD
    • Dockerfile示例
    • LABEL
    • MAINTAINER (deprecated)
    • EXPOSE
    • ENTRYPOINT
      • Shell形式的ENTRYPOINT示例
      • 理解CMD和ENTRYPOINT是如何交互的
    • VOLUME
    • USER
  • docker-compose.yaml文件中常用指令
    • compose文件结构和示例
    • 服务配置参考
      • build
        • dockerfile
        • context
        • shm_size
        • network
        • labels
        • cache_from
        • args
        • target
      • cap_add, cap_drop
      • cgroup_parent
      • command
      • configs
        • 短语法形式
        • 长语法形式
      • container_name
      • credential_spec
        • EXAMPLE GMSA CONFIGURATION
      • depends_on
      • deploy
        • endpoint_mode
        • labels
        • mode
        • placement
        • max_replicas_per_node
        • replicas
        • resource
        • restart_policy
        • rollback_config
        • Update_config
        • Not supported for docker stack deploy
      • devices
      • dns
      • dns_search
      • entrypoint
      • env_file
      • environment
      • expose
      • external_links
      • extra_hosts
      • healthcheck
      • image
      • init
      • isolation
      • labels
      • links
      • logging
      • network_mode
      • networks
        • alias
        • IPV4_ADDRESS, IPV6_ADDRESS
      • pid
      • ports
        • 长语法
        • 短语法
      • profiles
      • restart
      • secrets
        • 长语法
        • 短语法
      • security_opt
      • stop_grace_period
      • stop_signal
      • sysctls
      • tmpfs
      • ulimits
      • userns_mode
      • volumes
        • 长语法
        • 短语法
        • VOLUMES FOR SERVICES, SWARMS, AND STACK FILES
      • domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, work
      • Specifying durations
      • Specifying byte values
      • Volume configuration reference
        • driver
        • driver_opts
        • external
        • labels
        • name
      • Network configuration reference
        • name
        • external
        • labels
        • internal
        • ipam
        • enable_ipv6
        • driver
          • overlay
          • bridge
          • host或者none
        • driver_opts
        • attachable
      • configs configuration reference
      • secrets configuration reference
      • Variable substitution
      • Extension fields
  • docker-compose示例
    • WordPress
    • PostgreSQL
    • Django和PostgreSQL
    • Rails和PostgreSQL
  • Dockerfile最佳实践
Powered by GitBook
On this page

Was this helpful?

  1. Dockerfile指令

.dockerignore file

在Docker CLI将上下文发送到Docker守护进程之前,它将在上下文的根目录中查找名为.dockerignore的文件。如果此文件存在,则CLI会修改上下文以排除与其中的模式匹配的文件和目录。这有助于避免将较大或敏感的文件和目录发送到守护进程,并避免使用ADD或COPY将它们添加到镜像中。

CLI将.dockerignore文件解释为以换行符分隔的与Unix shell的文件通配符类似的模式列表。为了匹配,上下文的根被认为是工作目录和根目录。例如,模式/foo/bar和foo/bar都在PATH的foo子目录中或位于URL的git存储库的根目录中排除名为bar的文件或目录。两者都不排除其他任何东西。

如果.dockerignore文件中的行以#开头,则该行被视为注释,并且在CLI解释.dockerignore之前将被忽略。

.dockerfileignore文件示例:

# comment
*/temp*
*/*/temp*
temp?

.dockerignore会产生以下的构建行为:

Rule

Behavior

#comment

注释被忽视

*/temp*

在根目录的当前子目录中排除名称以temp开头的文件和目录。例如,排除了纯文本文件/somedir/temporary.txt,以及目录/somedir/temp。

*/*/temp*

在根目录的二级子目录中排除名称以temp开头的文件和目录。 例如 /somedir/subdir/temporary.txt

temp?

排除根目录中名称为temp的一个字符扩展的文件和目录。例如,排除/tempa和/tempb。

匹配是通过Go的filepath.Match规则完成的。预处理步骤删除了头部和尾部的空格,并使用Go的filepath.Clean消除了.和..元素。预处理后,空白的行将被忽略。

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

以!开头的行可用于指定不需要排除的文件或目录。以下是使用此机制的示例

.dockerignore文件:

*.md
!README.md

当前上下文中的所有markdown文件都不会被排除,除了README.md文件

*.md
!README*.md #不会影响最后一行的模式匹配,因为不是位于文件的最后一行。
README-secret.md # 虽然与上一行的模式匹配,但是位于文件的最后一行,所以依然会被排除。

markdown文件不会包含在当前上下文目录中,除了README文件,README-secret.md也不会包含在上下文目录中

现在考虑以下示例:

*.md
# 空行会被忽略
README-secret.md #出现在!开头的模式的前面,因此!README.md模式依然会对该行起作用,所以README-secret.md文件会被包含在上下文中。

!README*.md #会对上一行的模式匹配起作用,因为位于文件最后一行。

所有的README文件都会被包含在上下文中。中间的行不会起作用,因为!README*.md出现在最后一行。

我们甚至可以使用.dockerignore文件来排除Dockerfile和.dockerignore文件。这些文件仍被发送到docker守护进程。因为仍然需要它们来帮助完成构建镜像的任务。但是ADD和COPY指令不会将它们复制到镜像中。

最后,我们可能想要指定需要包含在上下文中的文件,而不是要排除的文件。为此,将*指定为第一个模式,然后指定一个或多个!模式。

Note:

因为历史原因,.通配符会被忽略 。

Previous了解ARG和FROM之间的交互方式NextRUN

Last updated 4 years ago

Was this helpful?