赞
踩
两种写法比对:
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]
注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多 少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。 RUN书写时的换行 符是\
功能为容器启动时要运行的命令
语法有三种写法
第三种比较好理解了,就时shell这种执行方式和写法 第一种和第二种其实都是可执行文件加上参数的形 式 举例说明两种写法:
CMD [ "sh", "-c", "echo $HOME"]
CMD [ "echo", "$HOME" ]
注意:补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。 原因是参数传递后,docker解析的是一个JSON array
不要把RUN和CMD搞混了。 RUN是构件容器时就运行的命令以及提交运行结果 CMD是容器启动时执行的命 令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子
功能是为镜像指定标签,为镜像写一些注释信息
语法:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
一个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相同,则值覆盖
功能为暴漏容器运行时的监听端口给外部 但是EXPOSE并不会vim 使容器访问主机的端口 如果想使得容器与主 机的端口有映射关系,必须在容器启动的时候加上 -P参数
语法:
EXPOSE 90/tcp 9090/udp 6000/tcp
注意:如果在端口号后面加/tcp,默认为tcp协议,如果需要UDP端口需要添加/udp
功能为设置环境变量 语法有两种
1. ENV 变量名=值
2. ENV = 变量名1=值1,变量名2=值2
两者的区别就是第一种是一次设置一个,第二种是一次设置多个
例子:创建一个httpd服务的镜像
[root@localhost ~]# vi Dockerfile
FROM centos:7
RUN yum install -y httpd
CMD /bin/bash
LABEL version="1.0"
LABEL "QQ"="34241235324"
LABEL "email=123434453@qq.com"
EXPOSE 80/tcp
ENV service=httpd
docker build -t cenos7:httpd .
docker run -itd --name httpd --privileged=true cenos7:httpd /usr/sbin/init -p 80:80
docker exec -it 487cdf7ddfc56249f59bee6639b52b03f2bd1090c6430eafc2e6973567249372 /bin/bash
一个复制命令,把文件复制到镜象中。 如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似 于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。
语法如下:
ADD source源文件 目标位置
ADD http:/aliyuan/httpd.html 目标位置
ADD tar包 目标位置
注意:尽量不要把写成一个文件夹,如果是一个文件夹了,复制整个目录的内容,包括文件系统元数据
复制命令,与ADD类似
语法如下:
COPY 源文件 目标文件
该命令与CMD类似,用于执行命令使用,还可以与CMD命令一起拼合使用
它与CMD的区别: 相同点:只能写一条,如果写多条,那么只有最后一条生效
不同点:CMD在创建容器时,在后面添加其他的CMD指令,CMD会被覆盖,但是ENTRYPOINT不会被覆盖,如果两个同时使用,CMD会变成ENTRYPOINT的参数
语法如下:
ENTRYPOINT ["ls","-l"]
ENTRYPOINT ls -al
注意: 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆 盖,谁在最后谁生效 如下:
ENTRYPOINT ["ls","-l"]
CMD ["ps","-ef"]
设置启动容器的用户,可以是用户名或UID,所以,只有下面的两种写法是正确的
语法如下:
USER zhangsan
USER UUID
设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次
语法如下:
WORKDIR /tmp
ENTRYPOINT ls -l
语法: ARG [=] 设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg = 来指定参数 如果用户在build镜像时指定了一个参数没有定义在Dockerfile种,那么将有一个Warning 提示如 下:
[Warning] One or more build-args [foo] were not consumed.
我们可以定义一个或多个参数并赋予默认值。如下:
ARG name
ARG age=18
使用场景,当我们需要指定一些软件的版本时,可以使用ARG来指定外部变量,在下载时使用较新的版本,还可以定义默认值
注意:如果我们给了ARG定义的参数默认值,那么当build镜像时没有指定参数值,将会使用这个默认值
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
图片转存中…(img-WwzMRnY5-1713039023349)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
[外链图片转存中…(img-SpXMk47p-1713039023349)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。