侧边栏壁纸
博主头像
码森林博主等级

一起走进码森林,享受编程的乐趣,发现科技的魅力,创造智能的未来!

  • 累计撰写 146 篇文章
  • 累计创建 74 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Docker(6):Dockerfile 文件指令详解

码森林
2022-02-24 / 0 评论 / 0 点赞 / 465 阅读 / 3,349 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-02-24,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前面我们学习了通过 Dockerfile 构建镜像,以及镜像分层和构建原理。本节我们主要学习 Dockerfile 文件的指令。

Dockerfile文件指令

FROM - 基于基准镜像

FROM 命令是定制的镜像都是基于 FROM 的镜像。如:

FROM centos #制作基准镜像,基于centos:latest
FROM scratch #不依赖于任何基准镜像base image
FROM tomcat:jdk8-corretto

# 注:尽量使用官方提供的Base Image,第三方提供的不清楚是否有漏洞或者后门~

LABEL & MAINTAINER - 说明信息

LABEL & MAINTAINER 主要是一些描述信息,这些信息不会产生实质的功能影响,主要用于辨别。

MAINTAINER zwqh.top #可以是组织机构~
LABEL version = "1.0"
LABEL description = "朝雾轻寒博客,一起学编程~"

WORKDIR - 设置工作目录

WORKDIR 主要是设置工作目录,如果设置的文件目录不存在,则会自动创建

WORKDIR /usr/local/tomcat/webapps
WORKDIR /usr/local/projects

# 注:尽量使用绝对路径,易于维护~

ADD & COPY - 复制文件

ADD & COPY 的主要职责就是完成文件复制,这两个命令大多数情况下是一样的,可以用 COPY 代替 ADD。

在不需要解压情况下使用 COPY,ADD 会进行自动解压。

ADD 除了复制,还具备添加远程文件功能,在实际工作中使用较少。

ADD project / #将文件project复制到根路径下
ADD zwqh.tar.gz / #添加到根路径并进行解压
ADD http://www.zwqh.top/1.txt  / #将远程文件添加到根目录

ENV - 设置环境变量

ENV 设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

ENV JAVA_HOME /usr/local/openjdk8
RUN ${JAVA_HOME}/bin/java -jar test.jar 

# 注:尽量使用环境变量,可以提供程序的可维护性~

RUN & ENTRYPOINT & CMD - 执行命令

RUN & ENTRYPOINT & CMD 都是执行命令,只是它们的执行时机不同。

  • RUN - 在镜像构建时执行(docker build)
  • ENTRYPOINT - 容器启动时执行命令(docker run)
  • CMD - 容器启动后执行默认的命令或参数(docker run)

ENTRYPOINT

ENTRYPOINT 有入口点的意思,用于在容器启动时执行命令。

注:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。其不会被docker run 指定的命令覆盖。

CMD

为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。

注:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。如果容器启动时指定了附加指令,则CMD被忽略。

命令格式

运行命令有两种格式:

shell 格式:

RUN yum install -y vim

exec 格式:

RUN ["yum","install","-y","vim"]

两种格式区别:

shell运行方式:

  • 使用shell执行时,当前shell是父进程,它创建一个子shell进程来执行命令
  • 在子shell进程中执行脚本,执行完后,子进程会退出销毁,回到当前shell

exec运行方式:

  • 使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变
  • 执行完毕,直接退出,并不会退回之前的进程环境

官方推荐采用exec~

示例

示例1:

#Dockerfile如下
FROM centos
RUN ["echo","image building..."]
CMD ["ps","-ef"]

#构建镜像
docker build -t zwqh.top/docker-run:1.0 /usr/image/docker-run

#运行内容
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM centos
 ---> 300e315adb2f
Step 2/3 : RUN ["echo","image building..."]
 ---> Running in 121ba33c0337
image building...
Removing intermediate container 121ba33c0337
 ---> 077c37604e44
Step 3/3 : CMD ["ps","-ef"]
 ---> Running in 8ebcc13ac3e8
Removing intermediate container 8ebcc13ac3e8
 ---> c3efc3f1e790
Successfully built c3efc3f1e790
Successfully tagged zwqh.top/docker-run:1.0

#创建运行容器
docker run zwqh.top/docker-run:1.0

#运行内容
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 14:38 ?        00:00:00 ps -ef

#再次运行
docker run zwqh.top/docker-run:1.0 ls

#运行结果
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

#由此我们得知CMD命令会被docker run附加指令覆盖~

可以看到RUN和CMD的运行时期是不同的~

示例2:

#修改Dockerfile如下
FROM centos
RUN ["echo","image building..."]
CMD ["ps","-ef"]

#构建镜像
 docker build -t zwqh.top/docker-run:1.1 /usr/image/docker-run
 
#运行内容
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : RUN ["echo","image building..."]
 ---> Using cache
 ---> 077c37604e44
Step 3/4 : ENTRYPOINT ["ps"]
 ---> Running in 4d756bfe4f43
Removing intermediate container 4d756bfe4f43
 ---> 599bf6615f40
Step 4/4 : CMD ["-ef"]
 ---> Running in 3ea20b225b79
Removing intermediate container 3ea20b225b79
 ---> 850c5a43b39c
Successfully built 850c5a43b39c
Successfully tagged zwqh.top/docker-run:1.1

#我们看到再次构建没有输出“image building”,前面说过,使用了临时镜像快照~

#创建启动容器
docker run zwqh.top/docker-run:1.1

#运行内容
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 14:44 ?        00:00:00 ps -ef

#我们看到ENTRYPOINT和CMD可以组合使用,CMD可以命令可以由docker run指定附加命令传参~

总结

本节我们学习了Dockerfile常用的基础命令以及运行指令,后面我们通过实战使用一些这些指令,循序渐进..

0

评论区