Dockerfile书写

发布于 2022-02-21  1931 次阅读


Dockerfile就像一道“圣旨”,任何人拿着这份文件执行docker build 都会生成相同功能的镜像。Dockerfile就是一份自动化的linux命令集。

  1. 命名:文件默认为Dockerfile,如果有多个可以命名为Dockerfile.second      ,构建时-f 文件名即可
  2. 整个构建过程“自动化”
  3. 遇到几个命令连在一起用“\&&”连接,如:
    RUN echo 'a' \
    && echo 'b'
    官方书写文档
  4. //注释
  5. 结构一般形如“指令 参数”,指令一般大写,如 INSTRUCTION arguments
  • FROM <imagesName:tag>
    FROM指令表示将要构建的镜像来自哪个镜像,FROM指令必须是整个Dockerfile第一句有效指令
  • MAINTALNER Name <Email>
    这个指令主要是指定维护者信息,方便他人寻找作者
  • RUN echo helloWorld
    shell格式,这条指令用来在Docker的编译环境中运行指定命令。
    RUN ["程序名","参数1","参数2"]
    exec格式,需要转义参数中的引号,不会触发shell,所以$HOME这样的环境变量无法使用
    RUN指令会在当前镜像的顶层执行任何命令,并commit成新的(中间)镜像,提交的镜像会在后面继续用到
  • ENV <key><value>
    ENV指令用来指定在执行docker run命令运行时,自动设置的环境变量。这个环境变量可以在后续任何RUN指令中使用,并在容器运行时保持,而且可以通过docker run命令的-e参数来修改环境变量。例如:ENV   TARGET_DIR /app
    WORKDIR  $TARGET_DIR
  • COPY /local/Path/File /images/Path/File
    COPY指令用来将本地的文件或文件夹复制到镜像的指定路径下。
  • ADD File  /images/Path/File
    ADD latest.tar.gz /var/www/
    ADD指令可以从一个URL地址下载内容复制到容器的文件系统中,还可以将压缩打包格式的文件解开后复制到指定位置。ADD只能对当前目录或上下文的文件进行操作
  • EXPOSE <端口> [<端口>……]
    EXPOSE指令用于标明这个镜像中的应用将会侦听某个端口,并且希望能将这个端口映射到主机的网络界面上。但是为了安全,docker run命令如果没有带上响应的端口映射多;数,Docker并不会将端口映射出去。
    此外EXPOSE端口是可以在多个容器之间通信用(links) ,通过--links 参数可以让多个容器通过端口连接在一起。
  • CMD ["executable", "param1", "param2"]
    设置镜像启动时执行的cmd命令
    CMD提供了容器默认的执行命令。Dockerfile 只允许使用一次CMD指令。使用多 个CMD会抵消之前所有的指令,只有最后一个指令生效。-般来说这是整个Dockerfile脚本的最后一条指令。 当Dockerfle已经完成了所有环境的安装与配置,通过CMD指令来指示docker run命令运行镜像时要执行的命令。
    值得注意的是,docker run命令可以覆盖CMD命令。CMD与ENTRYPOINT的功能极为相似。区别在于:如果dockerrun后面出现与CMD指定的相同的命令,那么CMD会被覆盖;而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令(不会对命令覆盖)。另外,CMD指令还可以单独作为ENTRYPOINT指令的可选参数,共同组合成一条完整的启动命令。如:CMD ["echo", "Hello Ubuntu"]
  • VOLUME ["/data","/data2"]
    VOLUME /data
    设置数据的VOLUME指令
  • USER user
  • USER user:group
    USER  uid:gid
    设置构建用户的user指令
  • WORKDIR /path/to/workdir
    设置工作目录的WORKDIR指令
  • FROM busybox
    ONBUILD RUN echo "a"
    设置二次构建指令的ONBUILD指令
  • LABEL multi. label1="value1" multi. label2="value2" other="value3"或
    LABEL multi. labell="value1" \
    multi. label2="value2" \
    other="value3"
    设置元数据的LABEL指令
  • 设置构建变量的ARG指令
  • 设置停止信号的STOPSIGNAL指令
  • 检查镜像状态的HEALTHCHECK指令
  • 设置命令执行环境的SHELL指令                                    书P106
子夜不哭
最后更新于 2022-02-21