当前位置:   article > 正文

【云原生】一文学会Dockerfile所有常用命令_dockerfile打包命令_dockerfile run

dockerfile run
  1. RUN
  2. RUN [“executable”, “param1”, “param2”] 第一种后边直接跟shell命令 . 在linux操作系统上默认 /bin/sh -c . 在windows操作系统上默认 cmd /S /C 第二种是类似于函数调用。 可将executable理解成为可执行文 件,后面就是两个参数。
两种写法比对: 

  • 1
  • 2
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME 
RUN ["/bin/bash", "-c", "echo hello"]
  • 1
  • 2

注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多 少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。 RUN书写时的换行 符是\

3.CMD

功能为容器启动时要运行的命令

语法有三种写法

  1. CMD [“executable”,“param1”,“param2”]
  2. CMD [“param1”,“param2”]
  3. CMD command param1 param2

第三种比较好理解了,就时shell这种执行方式和写法 第一种和第二种其实都是可执行文件加上参数的形 式 举例说明两种写法:

CMD [ "sh", "-c", "echo $HOME"]
CMD [ "echo", "$HOME" ]
  • 1
  • 2

注意:补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。 原因是参数传递后,docker解析的是一个JSON array

4.RUN和CMD的区别

不要把RUN和CMD搞混了。 RUN是构件容器时就运行的命令以及提交运行结果 CMD是容器启动时执行的命 令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子

5.LABEL

功能是为镜像指定标签,为镜像写一些注释信息

语法:

  • 1
  • 2
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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号 如下:

LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"
  • 1
  • 2
  • 3

注意:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖

6.EXPOSE

功能为暴漏容器运行时的监听端口给外部 但是EXPOSE并不会vim 使容器访问主机的端口 如果想使得容器与主 机的端口有映射关系,必须在容器启动的时候加上 -P参数

语法:

EXPOSE 90/tcp 9090/udp 6000/tcp
  • 1

注意:如果在端口号后面加/tcp,默认为tcp协议,如果需要UDP端口需要添加/udp

7.ENV

功能为设置环境变量 语法有两种

1. ENV 变量名=值
2. ENV = 变量名1=值1,变量名2=值2
  • 1
  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
8.ADD

一个复制命令,把文件复制到镜象中。 如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似 于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。

语法如下:

ADD source源文件 目标位置
ADD http:/aliyuan/httpd.html 目标位置
ADD tar包 目标位置
  • 1
  • 2
  • 3

注意:尽量不要把写成一个文件夹,如果是一个文件夹了,复制整个目录的内容,包括文件系统元数据

9.COPY

复制命令,与ADD类似

语法如下:

COPY 源文件 目标文件
  • 1
10.ADD与COPY的区别
  1. ADD在拷贝tar包时,到目标位置会自动解压,COPY还是源文件不会有任何变化
  2. ADD在拷贝过程中可以使用http链接来下载文件
11.ENTRYPOINT

该命令与CMD类似,用于执行命令使用,还可以与CMD命令一起拼合使用

它与CMD的区别: ​ 相同点:只能写一条,如果写多条,那么只有最后一条生效

不同点:CMD在创建容器时,在后面添加其他的CMD指令,CMD会被覆盖,但是ENTRYPOINT不会被覆盖,如果两个同时使用,CMD会变成ENTRYPOINT的参数

语法如下:

ENTRYPOINT ["ls","-l"]
ENTRYPOINT ls -al
  • 1
  • 2

注意: 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆 盖,谁在最后谁生效 如下:

ENTRYPOINT ["ls","-l"]
CMD ["ps","-ef"]
  • 1
  • 2
12.USER

设置启动容器的用户,可以是用户名或UID,所以,只有下面的两种写法是正确的

语法如下:

USER zhangsan
USER UUID
  • 1
  • 2
13.WORKDIR

设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次

语法如下:

WORKDIR /tmp
ENTRYPOINT ls -l
  • 1
  • 2
14.ARG

语法: ARG [=] 设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg = 来指定参数 如果用户在build镜像时指定了一个参数没有定义在Dockerfile种,那么将有一个Warning 提示如 下:

[Warning] One or more build-args [foo] were not consumed.
  • 1

我们可以定义一个或多个参数并赋予默认值。如下:

ARG name
ARG age=18
  • 1
  • 2

使用场景,当我们需要指定一些软件的版本时,可以使用ARG来指定外部变量,在下载时使用较新的版本,还可以定义默认值

注意:如果我们给了ARG定义的参数默认值,那么当build镜像时没有指定参数值,将会使用这个默认值

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
img

图片转存中…(img-WwzMRnY5-1713039023349)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
[外链图片转存中…(img-SpXMk47p-1713039023349)]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/928894
推荐阅读
相关标签
  

闽ICP备14008679号