丢失 之前 调用 nco this add 指令 directive 很大的
Dcokerfile 包含了所有用来组装 image 的命令。通过 docker build 来自动创建 image。
用法需要指定本地路径作为上下文目录,路径是本地系统的目录。而 docker build 会递归的从指定目录去寻找。
- $ docker build .
- Sending build context to Docker daemon 6.51MB ...
一般情况下,指定空目录且 Dockerfile 也在该目录中。当然也可以使用 - f 来指定 Dockerfile 的位置。
- $ docker build -f /path/to/a/Dockerfile .
如果构建成功,您可以指定要保存的 image 的存储库和标记:
- [email protected]:~/mydockerbuild$ docker build -t aiapple .
#生成了 aiapple 存储库的 image。
- [email protected]:~/mydockerbuild$ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- aiapple latest d2f5f84bec87 26seconds ago275.1MB
在创建 image 后,指定新 image 标记到多个存储库;
- [email protected]:~/mydockerbuild$ docker build -t zane/aiapple:007-t zane/aiapple:009 .
- Sending build context to Docker daemon 2.048 kB
- Step 1: FROM docker/whalesay:latest
- ---> 6b362a9f73eb
- Step 2: RUN apt-get -y update && apt-getinstall-y fortunes
- ---> Using cache
- ---> 845104a653c5
- Step 3: CMD /usr/games/fortune -a | cowsay
- ---> Using cache
- --->d2f5f84bec87
- Successfully built d2f5f84bec87[email protected]-V:~/mydockerbuild$ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- ziapple latest d2f5f84bec87 7minutes ago275.1 MB
- aiapple latest d2f5f84bec87 7minutes ago275.1 MB
- zane/aiapple007d2f5f84bec877minutes ago275.1 MB
- zane/aiapple009d2f5f84bec877minutes ago275.1MB
注意:
为了创建 image 的效率,docker build 使用中间 image(cache)。
格式'FROM'用来指定基础 image。
Dockerfile 第一行必须是:
语法解析器惯例解析器,小写,以及后面紧跟空行。
所有解析器指令必须位于 Dockerfile 的最顶端。类似脚本中 #!/bin/bash ;
# knowndirective=value
# unknowndirective=value
无效解析器被认为是注释,而注释之后的解析器 认为无效
# directive=value
FROM ImageName
解析器被认为是注释,因为在创建 image 说的之后。
FROM ImageName
# directive=value2
# directive=value1
解析器出现了两次
\tive=value
# direc
解析器要连续书写
两种无效的写法:
环境替换bash 的几个特性:
在 Dockerfile 中使用 $variable_name,
环境变量值,可以使用在 Dockerfile 中。
- FROM busybox
- ENV foo /bar
- WORKDIR ${foo} # WORKDIR /bar
- ADD . $foo # ADD . /bar
- COPY \$foo /quux # COPY $foo /quux
- ENV abc=hello
- ENV abc=bye def=$abc
- ENV ghi=$abc
可见是一行行整体执行的。
def 的值是 hello 不是 bye。而 ghi 的值是 bye。
.dockerignore file.dockerignore 支持正则表达式,
# comment
.dockerignore 文件第一行是:
不把这些文件发送给 docker daemon, 提升效率。而如果之后需要用到,则可以使用 ADD 或者 COPY 把他们放进 image 中。
在 docker 发送上下文给 docker daemon 之前,会寻找. dockerignore file 文件,去排除一些不需要的文件,或者很大的文件
- # comment
- */temp*
- */*/temp*
- temp?
filepath.Match
rules使用! ,排除例外。
- *.md
- !README*.md
- README-secret.md
考虑一下:
所有. md 结尾的文件,但是不包含 REME 开头的. md 文件,但 README-secret.md 除外。README-secret.md 是包含的。
- *.md
- README-secret.md
- !README*.md
类似于 Linux 中 IPtables 规则的配置,是按照顺序来的。
所有的. md 结尾的文件,和 README-secret.md 文件。不包含以 README 开头的. md 文件。即 README-secret.md 是不包含的。
FROMFROM
FROM
or
:
注意:
- RUN /bin/bash -c'source $HOME/.bashrc;\
- echo$HOME'
ADD 指令也会使缓存失效 CMD
- docker build --no-cache
- CMD [ "sh", "-c", "echo $HOME" ] 才会使用变量的替换
首选形式
- FROM ubuntu
- CMD echo "This is a test."|wc-
如果在 docker run 中指定参数,则会覆盖原来在 CMD 中默认指定的参数。
- FROM ubuntu
- CMD ["/usr/bin/wc","--help"]
- LABEL"com.example.vendor"="ACME Incorporated"
- LABEL com.example.label-with-value="foo"
- LABEL version="1.0"
- LABEL description="This text illustrates \that label-values can span multiple lines."
每个 LABEL 都会产生一个 layer, 如果有很多 layer 的话可能会导致 image 不工作。
单个 image layer也可以是
- LABEL multi.label1="value1"multi.label2="value2"other="value3"
如果原来已经存在的 key, 后面的 LABEL 会使用新的覆盖。 查看 image labels: docker inspectEXPOSE
- LABEL multi.label1="value1" multi.label2="value2" other="value3"
- ADD hom * /mydir/#adds all files starting with "hom"ADD hom ? .txt / mydir / # ? is replaced with any single character,
- e.g.,
- "home.txt"
所有的新文件和目录是被 UID,GID 为 0 所创建的。即使 root 了。 如果
- ADD test relativeDir/ # adds"test"to `WORKDIR`/relativeDir/
- ADD test /absoluteDir/ # adds"test"to /absoluteDir/
- COPY <src>... <dest>
- COPY hom * /mydir/#adds all files starting with "hom"COPY hom ? .txt / mydir / # ? is replaced with any single character,
- e.g.,
- "home.txt"
所有的新文件和目录是被 UID,GID 为 0 所创建的。即使 root 了。 COPY 规则类似 ADDENTRYPOINT
- COPY test relativeDir/ # adds"test"to `WORKDIR`/relativeDir/
- COPY test /absoluteDir/ # adds"test"to /absoluteDir/
- docker run -i -t --rm-p80:80nginx
shell 形式例子 FROM ubuntu ENTRYPOINT exec top -b cmd 和 entrypoint
- FROM ubuntu
- ENTRYPOINT ["top","-b"]
- CMD ["-c"]
上面的 基础 image 中,/myvol 已经有数据文件 greeting 此时又指定了 VOLUME 创建新的数据卷, 则将 greeting 文件复制到新数据卷。 USER
- FROM ubuntu
- RUN mkdir/myvol
- RUN echo "hello world"> /myvol/greeting
- VOLUME /myvol
pwd 命令最终的输出结果,会是 /a/b/c 可以联合环境变量使用 例子:
- WORKDIR /a
- WORKDIR b
- WORKDIR c
- RUN pwd
pwd 命令最终的输出结果,是 / path/$DIRNAME ARG
- ENV DIRPATH /path
- WORKDIR $DIRPATH/$DIRNAME
- RUN pwd
ARG 有默认值,且在 build 时没值传给 docker build 则使用 ARG 默认值。 ARG 值在 Dockerfile 定义的时就已经生效,而不是在执行的时候。 例子:
- FROM busybox
- ARG user1
- ARG buildno ...
通过这个 Dcokerfile build
- 1 FROM busybox
- 2USER ${user:-some_user}
- 3 ARG user
- 4USER $user...
第二行 USER 评估 some_user 作为 第三行 user 参数的定义值。 第四行 USER 认为从命令行传过来的 what_user 作为 user 参数的定义值。 在通过 ARG 指令定义之前,变量的任何使用都将导致空字符串。 ENVIRONMENT 参数定义会覆盖 同名的 ARG 定义:
- $ docker build --build-arg user=what_user Dockerfile
通过这个 Dockerfile build
- 1 FROM ubuntu
- 2 ARG CONT_IMG_VER
- 3ENV CONT_IMG_VER v1.0.0
- 4RUNecho$CONT_IMG_VER
这个例子中,会使用 v1.0.0 替代命令行传入的 v2.0.1. 这像是 shell 脚本中 本地环境变量 会 替代 通过参数传入过来的环境变量。 build 缓存的影响 ARG 变量不会作为环境变量持久化到 image 中。 然而它会在一些地方对 build 缓存存在一些影响。 如果 Dockerfile 定义了不同于之前 build 的 ARG 变量值时,缓存丢失会在第一次使用的时候出现,但值不是它原来的定义。 一般情况,在 ARG 后立即接 RUN,可以解决缓存丢失问题。 例子: 两个 Dockerfile
- $ docker build --build-arg CONT_IMG_VER=v2.0.1Dockerfile
- 1 FROM ubuntu
- 2 ARG CONT_IMG_VER
- 3RUNecho$CONT_IMG_VER
在两个文件命令中,都在命令行指定 CONT_IMG_VER 值,--build-arg CONT_IMG_VER =
- 1 FROM ubuntu
- 2 ARG CONT_IMG_VER
- 3RUNechohello
缓存丢失出现在了第三行,丢失原因是 ENV 参照 ARG 参数,然而这个参数在命令行被修改了。ONBUILD
- 1 FROM ubuntu
- 2 ARG CONT_IMG_VER
- 3 ENV CONT_IMG_VER $CONT_IMG_VER
- 4RUNecho$CONT_IMG_VER
(default:
- --interval=DURATION
)
- 30s
(default:
- --timeout=DURATION
)
- 30s
(default:
- --retries=N
)
- 3
Dcokerfile 参考
来源: http://www.bubuko.com/infodetail-2111384.html