Docker ------ Dockerfile初探
Docker-Dockerfile 初探
作者:elfin 资料来源:docker hub docker Docs
1、Dockerfile 前言
Dockerfile是镜像、容器的灵魂,没有它,额,你也可以生成镜像,但是完全不懂dockerfile仅使用docker,感觉是没有灵魂的!这样容易在环境上受限制!
--------------------以上纯属个人胡扯,不代表官方意见-------------------
在Best practices for writing Dockerfiles里面列举了基本的命令的最佳配置。
在Dockerfile reference里列举了所有的命令及其例子,其中包括:
- Usage
- BuildKit
- Format
- Parser directives
- syntax
- escape
- Environment replacement
- .dockerignore file
- FROM
- RUN
- CMD
- LABEL
- MAINTAINER (deprecated)
- EXPOSE
- ENV
- ADD
- COPY
- ENTRYPOINT
- VOLUME
- USER
- WORKDIR
- ARG
- ONBUILD
- STOPSIGNAL
- HEALTHCHECK
- SHELL
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
标志中使用了用户名或组名(官方在建议你使用数字标识),则生成操作将失败。使用数字标识不需要查找,也不依赖于容器根文件系统内容。
如果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( )。 - 如果直接指定了多个
资源或由于使用通配符,则 必须是一个目录,并且必须以斜杠/结尾。 - 如果
没有以尾随斜杠结尾,它将被视为常规文件, 的内容将写入 。 - 如果
不存在,则会连同路径中所有丢失的目录一起创建。
生成一个镜像:
FROM ai_container:2021
WORKDIR /home/project_data/
ENTRYPOINT ["/bin/bash"]
在当前文件下执行docker build ./ -t ai_container:test
即可得到结果
命令在官方文档都可以查到,就不花时间专门转写,这里就遇到-持续更新……
完!