Docker ------ Dockerfile初探

Docker-Dockerfile 初探


作者:elfin  资料来源:docker hub  docker Docs


Bottom

1、Dockerfile 前言

​ Dockerfile是镜像、容器的灵魂,没有它,额,你也可以生成镜像,但是完全不懂dockerfile仅使用docker,感觉是没有灵魂的!这样容易在环境上受限制!

--------------------以上纯属个人胡扯,不代表官方意见-------------------

Best practices for writing Dockerfiles里面列举了基本的命令的最佳配置。

Dockerfile reference里列举了所有的命令及其例子,其中包括:

Top - Bottom


2、ADD命令

ADD有两种形式:

ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

后一种形式对于包含空白的路径是必需的。

​ 注:--chown只能在创建Linux containers使用,windows containers不支持!这里用户和组的所有权的概念不能在linux与windows间转换,因此使用/etc/passwd和/etc/group将用户和组名称转换为id限制了此功能仅适用于基于Linux操作系统的容器。

作用

  • ADD指令从复制新文件、目录或远程文件url,并将它们添加到位于路径的映像文件系统中。
  • 可以指定多个资源,但如果它们是文件或目录,则它们的路径被解释为相对于构建上下文的源。
# 添加所有以“hom”开头的文件
ADD hom* /mydir/
# 匹配“hom?.txt”形式的的文件
ADD home.txt /mydir/
# 添加到WORKDIR的相对路径
ADD test.txt relativeDir/
# 添加文件到绝对路径
ADD test.txt /absoluteDir/
# 添加包含特殊字符(如‘[’和‘]’)的文件或目录时,需要按照Golang(GO语言)规则对这些路径进行转义,以防止它们被视为匹配模式(参考正则,使用[]是有特殊意义的,这里中括号可以是分隔符)
# 如果要添加arr[0].txt,需要使用如下的形式
ADD arr[[]0].txt /mydir/

重要知识点

​ 所有新文件和目录都是用UID和GID为0(用户ID、组ID为0,是root嘛?)创建的,除非可选--chown标志指定了给定的用户名、组名或UID/GID组合来请求添加内容的特定所有权。--chown标志的格式允许username和groupname字符串,也可以是任意组合的直接整数UID(用户标识符)和GID(用户属标识符)。提供没有groupname的用户名或没有GID的UID将使用与GID相同的数字UID。如果提供了用户名或组名,容器的根文件系统/etc/passwd和/etc/group文件将分别用于执行从名称到整数UID或GID的转换。以下示例显示--chown标志的有效定义:

ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/

如果容器根文件系统不包含/etc/passwd/etc/group文件,并且在--chown标志中使用了用户名或组名(官方在建议你使用数字标识),则生成操作将失败。使用数字标识不需要查找,也不依赖于容器根文件系统内容。

如果是远程文件URL,则目标将拥有600的权限。如果正在检索的远程文件具有HTTP Last-Modified头,则该头中的时间戳将用于设置目标文件上的mtime。但是,与ADD过程中处理的任何其他文件一样,mtime不会包含在文件是否已更改的确定中,并且应该更新缓存。

ADD的其他规则

  • 不可以使用ADD ../something /something添加其他目录的文件,因为使用docker build首先会将当前文件夹及其子文件夹加入docker daemon。
  • 如果是一个URL,并且没有以斜杠结尾,则会从该URL下载一个文件并将其复制到
  • 如果是一个URL,以一个尾部斜杠结尾,则从URL推断文件名并将文件下载到/。例如,添加http://example.com/foobar/将创建文件/foobar。URL必须有一个非平凡的路径,以便在这种情况下可以发现适当的文件名(http://example.com将不工作)。
  • 如果是一个目录,则复制目录的全部内容(只复制文件夹内的资源,本身不复制),包括文件系统元数据。
  • 如果是使用可识别的压缩格式(identity、gzip、bzip2或xz)的本地tar归档文件,则将其解压为一个目录。来自远程URL的资源不会解压缩。文件冲突时,按照源树的内容为准。(文件是否被标识为可识别的压缩格式完全取决于文件的内容,而不是文件的名称。例如,如果一个空文件碰巧以gz结尾,这将不会被识别为压缩文件,也不会生成任何类型的解压缩错误消息,而是将文件简单地复制到目标。)
  • 如果是任何其他类型的文件,则单独复制它及其元数据。在这种情况下,如果以一个斜杠/结尾,它将被视为一个目录,的内容将写入/base()。
  • 如果直接指定了多个资源或由于使用通配符,则必须是一个目录,并且必须以斜杠/结尾。
  • 如果没有以尾随斜杠结尾,它将被视为常规文件,的内容将写入
  • 如果不存在,则会连同路径中所有丢失的目录一起创建。

Top - Bottom


生成一个镜像:

FROM ai_container:2021
WORKDIR /home/project_data/
ENTRYPOINT ["/bin/bash"]

在当前文件下执行docker build ./ -t ai_container:test即可得到结果


命令在官方文档都可以查到,就不花时间专门转写,这里就遇到-持续更新……

完!

posted @ 2020-12-11 18:15  巴蜀秀才  阅读(74)  评论(0编辑  收藏  举报