这篇文章将为大家详细讲解有关docker中dockerfile语法如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
在成都网站建设、网站制作过程中,需要针对客户的行业特点、产品特性、目标受众和市场情况进行定位分析,以确定网站的风格、色彩、版式、交互等方面的设计方向。创新互联公司还需要根据客户的需求进行功能模块的开发和设计,包括内容管理、前台展示、用户权限管理、数据统计和安全保护等功能。
FROM关键字
指定基础镜像,并且必须是第一条指令。如果不以任何镜像为基础,那么写法为:FROM scratch。同时意味着接下来所写的指令将作为镜像的第一层开始,语法:
FROMFROM : FROM :
三种写法,其中
例:
FROM scratch #制作base imageFROM centos #以centos作为base image
LABEL关键字
为镜像指定标签,语法:
LABEL= = = ...
一个Dockerfile种可以有多个LABEL,如下:
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 multi.label1="value1" \multi.label2="value2" \other="value3"
说明:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖
例:
LABEL maintainer="asd@163.com" #维护者信息 LABEL version="1.0" #版本 LABEL description="这是描述" #镜像描述信息
RUN关键字
功能为运行指定的命令,每运行一次RUN对image而言都生成新的一层,RUN命令有两种格式
1. RUN2. RUN ["executable", "param1", "param2"]
第一种后边直接跟shell命令
在linux操作系统上默认 /bin/sh -c
在windows操作系统上默认 cmd /S /C
第二种是类似于函数调用。可将executable理解成为可执行文件,后面就是两个参数。
两种写法比对:
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]
注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。
当命令较多,或较长时,建议将命令换行,RUN书写时的换行符是 \
例:
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/list/*
WORKDIR关键字
设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。相当于 cd,如果不存在要打开的目录则会创建,可以设置多次。语法:
WORKDIR /path/to/workdir
例:
WORKDIR /ROOT #将工作目录切换到root下
WORKDIR /test #将工作目录切换到test目录 没有则创建 WORKDIR demo #结合上一句 此时工作目录被切换到/test/demo目录下
尽量使用WORKDIR,而不使用RUN cd,尽量使用局对目录。
ADD关键字
一个复制命令,把文件复制到镜像中。如果把宿主机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。语法如下:
1. ADD... 2. ADD [" ",... " "]
如以下写法都是可以的:
ADD test relativeDir/ #将test复制到容器内,相对于当前工作目录下的relativeDir目录中
ADD test /relativeDir #将test复制到容器内根目录下relativeDir目录中
ADD http://example.com/foobar / #将网络文件下载到根目录下
尽量不要把
有如下注意事项:
1、如果源路径是个文件,且目标路径是以 / 结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下。如果目标路径不存在,则会自动创建目标路径。
2、如果源路径是个文件,且目标路径是不是以 / 结尾,则docker会把目标路径当作一个文件。如果目标路径不存在,会以目标路径为名创建一个文件,内容同源文件;如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名。如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。 注意,这种情况下,最好显示的以 / 结尾,以避免混淆。
3、如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个目录,把源路径目录下的文件拷贝进来。如果目标路径是个已经存在的目录,则docker会把源路径目录下的文件拷贝到该目录下。
4、如果源文件是个归档文件(压缩文件),则docker会自动帮解压。
COPY关键字
看这个名字就知道,又是一个复制命令,与ADD用法基本相同,COPY的
1. COPY... 2. COPY [" ",... " "]
例:
ADD hello / #将hello文件复制到容器内根目录下 ADD test.tar.gz / #将压缩文件添加到容器内根目录下并解压
WORKDIR /root #将工作目录切换到root目录下 ADD hello test/ #将hello文件添加到/root/test目录下
WORKDIR /root #将工作目录切换到root目录下 copy hello test/ #将hello文件复制到/root/test
ENV关键字
功能为设置环境变量设置常量,语法有两种:
1. ENV2. ENV = ...
两者的区别就是第一种是一次设置一个,第二种是一次设置多个。
例:
ENV MySQL_VERSION 5.6 #设置常量 RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \ #使用常量 && rm -rf /var/lib/apt/list/*
CMD关键字
功能为容器启动时要运行的命令,语法有三种写法
1. CMD ["executable","param1","param2"]2. CMD ["param1","param2"]3. CMD command param1 param2
第三种比较好理解了,就时shell这种执行方式和写法,第一种和第二种其实都是可执行文件加上参数的形式,举例说明两种写法:
CMD [ "sh", "-c", "echo $HOME"
CMD [ "echo", "$HOME" ]
补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号,原因是参数传递后,docker解析的是一个JSON array
注意事项:
容器启动时默认执行的命令
如果docker run 指定了其他命令,CMD命令被忽略
如果定义了多个CMD,只有最后一个会执行
RUN & CMD
不要把RUN和CMD搞混了。RUN是构件容器时就运行的命令以及提交运行结果,CMD是容器启动时执行的命令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子
ENTRYPOINT关键字
功能是启动时的默认命令,语法如下:
1. ENTRYPOINT ["executable", "param1", "param2"]2. ENTRYPOINT command param1 param2
与CMD比较说明(这俩命令太像了,而且还可以配合使用):
1. 相同点:
只能写一条,如果写了多条,那么只有最后一条生效
容器启动时才运行,运行时机相同
2. 不同点:
ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖
如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
shell格式:即把要运行的命令当做shell执行
RUN apt-get install -y vim CMD echo "hello docker" ENTRYPOINT echo "hello docker"
Exec格式:即是 命令,参数格式
RUN ["apt-get", "install", "-y", "vim"] CMD ["/bin/echo", "hello docker"] ENTRYPOINT ["/bin/echo", "hello docker"]
例:以下两个dockerfile结果相同
FROM centos #指定基础镜像为centos EVN name Docker #设定常量name 值为Docker ENTRYPOINT echo "hello $name" #执行acho命令
以上dockerfile生成的镜像运行容器时输出 hello Docker
FROM centos #指定基础镜像为centos EVN name Docker #设定常量name 值为Docker ENTRYPOINT ["/bin/echo", "hello $name"] #执行acho命令
以上dockerfile生成的镜像运行容器时输出 hello $name,因为 ENTRYPOINT ["/bin/echo", "hello $name"] 指定容器启动时运行的就是echo命令 不会识别$为变量,做如下修改:
FROM centos #指定基础镜像为centos EVN name Docker #设定常量name 值为Docker ENTRYPOINT ["/bin/bash", "-c", "echo", "hello $name"] #在shell中执行acho命令
容器启动时输出 hello Docker
关于docker中dockerfile语法如何使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
标题名称:docker中dockerfile语法如何使用
本文地址:http://scyingshan.cn/article/gpegdp.html