5. dockerfile参考¶
5.1. 使用¶
docker build
docker build -t zhaojiedi1992/helloworld:v1.0 -t zhaojiedi1992/helloworld:latest -f -f /path/to/a/Dockerfile .
5.2. 注释¶
dockefile中注释使用#开头。
# 这是一个注释行
5.3. 转义¶
dockerfile中使用来转义空格、换行符等。
5.4. 环境变量替换¶
环境变量通过ENV指定,支持bash操作的。比如${foo},${foo-abc}等
可以使用环境变量的片段为:
ADD
COPY
ENV
EXPOSE
FROM
LABEL
STOPSIGNAL
USER
VOLUME
WORKDIR
备注
在1.4版本之后,ONBUILD也支持使用环境变量了。
5.5. .dockerignore文件¶
dockerfile 主要配合add,copy使用,包含在dockerignore的配置被过滤掉的。具体的语法类似gitignore文件。
5.6. FROM¶
FROM用于指定基础镜像的名字。
用法:
FROM <image> [AS <name>]
FROM <image>[:<tag>] [AS <name>]
FROM <image>[@<digest>] [AS <name>]
使用样例
ARG CODE_VERSION=latest
FROM base:${CODE_VERSION}
CMD /code/run-app
ARG不同于ENV的,ARG作用于docker命令构建的时候,ENV是在镜像构建后,实例化的时候运行的。
5.7. RUN¶
RUN有2种格式用法
RUN <command>
RUN ["executable", "param1", "param2"]
5.8. CMD¶
CMD有三种格式用法。
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
5.9. LABEL¶
LABEL用于定义描述信息。是一个key,value对
用法:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
定义的LABEL信息,可以通过docker inspect命令获取镜像的LABEL信息。
5.10. MAINTAINER (已经弃用了)¶
使用如下设置维护者。
LABEL maintainer="SvenDowideit@home.org.au"
5.11. EXPOSE¶
用于指定需要暴露的的端口,用法:
EXPOSE <port> [<port>/<protocol>...]
样例:
EXPOSE 80/tcp
EXPOSE 80/udp
我们可以在docker运行时重设这些设置信息。
docker run -p 80:80/tcp -p 80:80/udp ...
5.12. ENV¶
用于定义运行时的变量
ENV <key> <value>
ENV <key>=<value> ...
样例:
ENV myName="John Doe" myDog=Rex\ The\ Dog \
myCat=fluffy
5.13. ADD¶
用于从当前的目录复制文件到镜像中去
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
5.14. COPY¶
用于从当前的目录复制文件到镜像中去
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
5.15. ENTRYPOINT¶
ENTRYPOINT用于定义进入点,用法2种。
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
样例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
如果docker运行的时候想重写ENTRYPOINT,可以指定–entrypoint 选项。
ENTRYPOINT 和CMD
ENTRYPOINT “ENTRYPOINT exec_entry p1_entry” |
ENTRYPOINT [exec_entry, p1_entry] |
||
---|---|---|---|
No CMD |
error, not allowed |
/bin/sh -c exec_entry p1_entry |
exec_entry p1_entry |
CMD [exec_cmd, p1_cmd] |
exec_cmd p1_cmd |
/bin/sh -c exec_entry p1_entry |
exec_entry p1_entry exec_cmd p1_cmd |
CMD [p1_cmd, p2_cmd] |
p1_cmd p2_cmd |
/bin/sh -c exec_entry p1_entry |
exec_entry p1_entry p1_cmd p2_cmd |
CMD exec_cmd p1_cmd |
/bin/sh -c exec_cmd p1_cmd |
/bin/sh -c exec_entry p1_entry |
exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd |
5.16. VOLUME¶
用于设置卷,用法:
VOLUME ["/data"]
5.17. USER¶
设置运行的用户身份,用法:
USER <user>[:<group>] or
USER <UID>[:<GID>]
5.18. WORKDIR¶
设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD都是有影响的。
样例:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
上面的打印结果为/a/b/c的。
5.19. ARG¶
ARG用于指定参数,用法:
ARG <name>[=<default value>]
样例:
docker build --build-arg <varname>=<value>
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}
RUN echo $CONT_IMG_VER
5.20. ONBUILD¶
ONBUILD会在此镜像作为其他镜像的基础镜像的时候被执行。
构建步骤:
当遇到ONBUILD指令时,构建器会向正在构建的镜像的元数据添加触发器。 该指令不会影响当前构建。
在构建结束时,所有触发器的列表都存储在映像清单中的OnBuild键下。 可以使用docker inspect命令检查它们。
稍后,可以使用FROM指令将镜像用作新构建的基础。 作为处理FROM指令的一部分,下游构建器查找ONBUILD触发器,并按照它们注册的顺序执行它们。 如果任何触发器失败,则中止FROM指令,这反过来导致构建失败。 如果所有触发器都成功,则FROM指令完成,并且构建继续照常进行。
执行后,触发器将从最终镜像中清除。
样例:
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
5.21. STOPSIGNAL¶
设置发送的信号。
STOPSIGNAL SIGKILL
5.22. HEALTHCHECK¶
提供健康检查功能,用法:
HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE
# 选项有
--interval=DURATION (default: 30s)
--timeout=DURATION (default: 30s)
--start-period=DURATION (default: 0s)
--retries=N (default: 3)
5.23. SHELL¶
指定shell的,用法。
SHELL ["executable", "parameters"]
# 在linux下为 ["/bin/sh", "-c"]
# 在window下为 ["cmd", "/S", "/C"]