9、Dockerfile语法

??在Dockerfile中定义了很多关键字,通过关键字来完成Dockerfile的编写。
??Dockerfile官方文档

9.1 FROM

??在Dockerfile中FROM主要是指定这个Dockerfile基于哪一个base image构建。Docker Dockerfile按顺序运行指令。一个Dockerfile 必须用FROM指令启动,放在第一行。

FROM scratch        # 制作base image
FROM centos         # 使用base image
FROM ubuntu:14.04   # 使用指定版本的base image

安全起见,尽量使用官方的image作为base image。

9.2 LABEL

??在Dockerfile中LABEL实际上是英译了Metadata,就像是代码中的注释。主要包含了该镜像的作者、版本和描述信息。

LABEL maintainer="[email protected]"
LABEL version="1.0"
LABEL description="This is description"

Metadata不可少!

9.3 RUN

??在Dockerfile中RUN用来运行命令,其中命令必须是在第一行FROM中指定的base image所能运行的。每运行一次RUN,构建的image都会生成新的一层layer。

RUN yum update && yum install -y vim     python-dev                # 反斜杠换行
RUN apt-get update && apt-get install -y perl     pwgen --no-install-recommends && rm -rf     /var/lib/apt/lists/*      # 注意清理cache
RUN /bin/bash -C 'source $HOME/.bashrc;echo $HOME'

为了美观,复杂的RUN可以使用反斜杠换行。
为了避免无用分层,多条命令尽量合并一行。

9.4 WORKDIR

??在Dockerfile中WORKDIR用来设定当前工作目录,类似Linux系统中的cd命令。

WORKDIR /root
WORKDIR /test        # 如果没有该目录,则会自动创建
WORKDIR demo
RUN pwd              # 输出的结果应该是/test/demo

用WORKDIR,不要使用RUN cd !!!
为了避免出错,尽量使用绝对路径。

9.4 ADD和COPY

??在Dockerfile中ADD和COPY作用相似,都是把本地的文件添加到docker image中。区别:ADD不仅可以添加文件,还可以解压缩文件,COPY不可以解压缩文件。

ADD hello /
ADD test.tar.gz /        # 添加到image的根目录并且解压
WORKDIR /root
ADD hello test/          # 将hello添加到image的/root/test/hello
WORKDIR /root
COPY hello test/         # 跟上面的效果一样

大部分情况下COPY优于ADD。
ADD除了COPY还有额外功能(解压)。
添加远程文件/目录,请使用curl或者wget。

9.5 ENV

??在Dockerfile中ENV来设置环境变量或者一些常量。可以在ENV设置的常量后面直接使用。

ENV MYSQL_VERSION 5.6        # 设置常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}"     && rm -rf /var/lib/apt/lists/*        #引用常量

尽量使用ENV增加可维护性!

9.6 VOLUME

??在Dockerfile中VOLUME用于向基于镜像创建的容器添加卷,一个卷可以存在于一个或多个容器的特定目录,这个目录可以绕过联合文件系统,并提供共享数据、数据持久化的功能。

VOLUME ["/data"]

9.7 EXPOSE

??在Dockerfile中EXPOSE设置容器暴露的端口,可以指定一个或多个端口。

EXPOSE 80

虽然在EXPOSE指令中已经暴露了指定的端口,但是在启动容器的时候还是要指定端口信息,容器本身不会自动暴露端口。

9.8 CMD

??在Dockerfile中CMD设置容器启动后默认执行的命令和参数。如果定义了多个CMD,只会执行最后一个。

CMD ["executable","param1","param2"]        # 执行形式,这是首选形式
CMD ["param1","param2"]                     # 作为进入点的默认参数
CMD command param1 param2                   # 壳形式

不要定义多个CMD,多个CMD只有最后一个会执行。

9.9 ENTRYPOINT

??在Dockerfile中ENTRYPOINT设置容器启动时运行的命令,可以让容器以应用程序或者服务器的形式运行,而且ENTRYPOINT设定的命令不会被忽略,一定会执行。

COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

可以写一个shell脚本作为ENTRYPOINT的入口。

RUN、CMD、ENTRYPOINT对比

  • RUN 执行命令并创建新的image layer
  • CMD 设置容器启动后默认执行的命令和参数
  • ENTRYPOINT 设置容器启动时运行的命令

shell格式和exec格式

  • shell格式
RUN apt-get install -y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"

??Dockerfile

FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"

??构建镜像:

docker build -t staryjie/centos-entrypoint-shell .

??运行容器:

docker run staryjie/centos-entrypoint-shell

hello Docker
  • exec格式
RUN ["apt-get","install","-y","vim"]
CMD ["/bin/echo","hello docker"]
ENTRYPOINT ["/bin/echo","hello docker"]

??Dockerfile

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/echo","hello $name"]

??构建镜像:

docker build -t staryjie/centos-entrypoint-exec .

??运行容器:

docker run staryjie/centos-entrypoint-exec

hello $name

??改写Dockerfile

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash","-c","echo hello $name"]

??构建镜像:

docker build -t staryjie/centos-entrypoint-exec-new .

??运行容器:

docker run staryjie/centos-entrypoint-exec-new

hello Docker
  1. CMD

    • 容器启动时默认执行的命令
    • 如果docker run指定了其他命令,CMD命令会被忽略
    • 如果定义了多个CMD,只有最后一个会执行
  2. ENTRYPOINT
    • 让容器以应用程序或者服务的形式运行
    • 不会被忽略,一定会执行

原文地址:https://www.cnblogs.com/jie-fang/p/10279690.html

时间: 2024-10-09 16:02:23

9、Dockerfile语法的相关文章

dockerfile语法

dockerfiles的指令不区分大小写,但约定为全部大写 dockerfiles支持如下语法命令: 1.FROM <image name> 所有的dockerfile都必须以from命令开始,from命令会指定镜像基于哪个基础镜像而创建 如: FROM ubuntu 2.MAINTAINER <author name> 设置该镜像的作者 3.RUN <command> 在shell或者exec的环境下执行的命令,run指令会在新创建的镜像添加新的层面,接下来提交的结果

dockerfile 语法

基本语法格式:INSTRUCTION arguments (指令+参数)不分大小写 注释格式:# 注释 第一个指令必须是FROM,标示使用什么镜像 1.解析器指令 解析器指令是可选的,并且影响处理Dockerfile中后续行的方式. 解析器指令不会向构建中添加图层,并且不会显示为构建步骤. 解析器指令以#directive = value的形式写为特殊类型的注释. 单个指令只能使用一次. 一旦注释,空行或构建器指令已经被处理,Docker不再寻找解析器指令. 相反,它将格式化为解析器指令的任何内

Dockerfile语法解析

Dockfile介绍 从上到下依次执行 每次执行一条指令就创建一个镜像层 第一条指令必须是FROM    表示需要构建的镜像是由哪个镜像为基础镜像   后续的指令运行于此基准镜像所提供的运行环境 可以设置 .dockeringore 指定不打包进镜像的文件列表 在docker build中执行的shell命令环境是由基础镜像所包含的命令集合 ${ varriable:-default }  如果变量未设置值,则给变量赋一个默认值   ${ variable: +default } 如果已经给变量

四:(之八_Linux压力测试工具stress)Dockerfile语法梳理和实践

8.1 安装stress stress目前是在该目录下的可执行文件 --vm 创建几个进程 --vm-bytes 为每个进程分配多少内存 8.2 debug输出stress创建进程的过程 一直在创建有256m的内存进程,然后释放,循环反复. 进程分配的内存不能超过dockerhost的限制: 查看内存 8.3 使用Dockerfile在程序运行时添加动态参数: 使用ENTRYPOINT [命令] + CMD [] 原文地址:https://www.cnblogs.com/chaos-li/p/1

Dockerfile 详解

###################################################################################### 文章中有错或者其他问题请联系小弟:[email protected] ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 为什么要使用Dockerfile Dockerfile 能搭建出一抹一样的环境

Dockerfile命令介绍及实例

Dockerfile命令介绍及实例 当你在使用 Docker构建镜像的时候,每一个命令都会在前一个命令的基础上形成一个新层.这些基础镜像可以用于创建新的容器.本篇文章将手把手教您如何从基础镜像,一步一步,一层一层的从Dockerfile构建容器的过程. 基础镜像可以用于创建Docker容器.镜像可以非常基础,仅仅包含操作系统:也可以非常丰富,包含灵巧的应用栈,随时可 以发布.当你在使用 Docker构建镜像的时候,每一个命令都会在前一个命令的基础上形成一个新层.这些基础镜像可以用于创建新的容器.

手把手教你写Dockerfile, 附赠MongoDB和Nginx Dockerfile编写实例

手把手教你写Dockerfile, 附赠MongoDB和Nginx Dockerfile编写实例 基础镜像可以用于创建Docker容器.镜像可以非常基础,仅仅包含操作系统:也可以非常丰富,包含灵巧的应用栈,随时可以发布.当你在使用 Docker构建镜像的时候,每一个命令都会在前一个命令的基础上形成一个新层.这些基础镜像可以用于创建新的容器.本篇文章将手把手教您如何从基础镜 像,一步一步,一层一层的从Dockerfile构建容器的过程. Docker简介 Docker项目提供了构建在Linux内核

Dockerfile 第一个自己的镜像

1. Dockerfile 语法 FROM base image RUN // 执行命令 ADD // 添加文件, 这里可以添加远程文件 COPY // 拷贝文件 CMD // 执行命令 EXPOST // 暴露端口 WORKDIR // 指定路径 MAINTAINER //维护者 ENV // 设定环境变量 ENTRYPOINT // 容器入口 USER // 指定用户 VOLUME mount point // 容器所挂载的券 创建第一个自己的镜像: 1. 编辑 Dockerfile 文件

Dockerfile格式以及Dockerfile示例

笔记内容:Dockerfile格式以及Dockerfile示例笔记日期:2018-02-07 25.13/25.14 Dockerfile创建镜像 –Dockerfile语法 25.15/25.16 Dockerfile创建镜像 –Dockerfile示例 Dockerfile创建镜像 –Dockerfile语法 之前我们介绍过通过容器创建镜像以及通过模板创建镜像,除了这两种方式之外,我们还可以通过Dockerfile去创建镜像. Dockerfile是由一系列命令和参数构成的脚本,这些命令应用