Dockerfile:Docker中构建镜像用到的文本文档

开发 前端
在我们进行JavaEE开发的时候,经常使用Maven或者Gradle进行包管理,当我们需要某一个包时,只需在Maven或者Gradle添加该包的唯一标识,这个包就能从远程仓库拉取到本地,搭建私服的也会先从私服里拉取该包。当我们自己封装了一个比较好的包,也可以通过这些工具推送给远程仓库。正好,Docker镜像的拉取或者推送也是相同的原理。

 在我们进行JavaEE开发的时候,经常使用Maven或者Gradle进行包管理,当我们需要某一个包时,只需在Maven或者Gradle添加该包的唯一标识,这个包就能从远程仓库拉取到本地,搭建私服的也会先从私服里拉取该包。当我们自己封装了一个比较好的包,也可以通过这些工具推送给远程仓库。正好,Docker镜像的拉取或者推送也是相同的原理。

 

 

[[279729]]

通过前两章的讲解,相信大家对于Docker的相关概念、常用命令有了基本的了解,也知道怎么从远程 Pull 一个镜像,那远程的镜像是怎么来的呢?如果我们想自己创建一个镜像又该怎么做呢?今天就来说一说Dockerfile!Dockerfile 是一个包含用户能够构建镜像的所有命令的文本文档,它有自己的语法以及命令,Docker 能够从 Dockerfile 中读取指令自动的构建镜像!

Dockerfiler的本质是一个文本文档,既然是一个文本文档,就要了解这个文档的编写规则,也就是对 Dockerfile 的语法和命令需要了解,下面就来说一说它的相关指令!

1、FROM

  1. 语法: 
  2. FROM <image> [AS<name>]  
  3. FROM <image>[:<tag>][AS <name>]  
  4. FROM<image>[@<digest>] [AS <name>]  

from就是从哪里来,对于Docker官方说法就是指定基础镜像,当前镜像是基于哪个镜像创建的,有点类似 Java 中的类继承。FROM 指令必是 Dockerfile 文件中的首条命令。

2、MAINTAINER

  1. 语法: 
  2. MAINTAINER <name>  

镜像维护者的信息,已经舍弃该指令。

3、LABEL

  1. 语法: 
  2. LABEL<key>=<value><key>=<value><key>=<value> ...  

4、ENV

ENV  ENV = ...

设置环境变量!

5、WORKDIR

  1. WORKDIR /path/to/workdir  

设置工作目录,在该指令后的 RUN、CMD、ENTRYPOINT, COPY、ADD 指令都会在该目录执行。如果该目录不存在,则会创建!

6、RUN

  1. RUN <command>  
  2.   RUN ["executable","param1""param2"]  

RUN 会在当前镜像的最上面创建一个新层,并且能执行任何的命令,然后对执行的结果进行提交。提交后的结果镜像在 Dockerfile 的后续步骤中可以使用。

7、ADD

  1. ADD[--chown=<user>:<group>] <src>... <dest>  
  2.   ADD[--chown=<user>:<group>] ["<src>",..."<dest>"]  

从宿主机拷贝文件或者文件夹到镜像,也可以复制一个网络文件!如果拷贝的文件是一个压缩包,会自动解压缩!

8.COPY

  1. COPY[--chown=<user>:<group>] <src>... <dest>  
  2.   COPY[--chown=<user>:<group>] ["<src>",..."<dest>"]  

从宿主机拷贝文件或者文件夹到镜像,不能复制网络文件也不会自动解压缩!

9、VOLUME

  1. VOLUME ["/data"]  

VOLUME 用于创建挂载点,一般配合 run 命令的 -v 参数使用。

10、EXPOSE

  1. EXPOSE <port>[<port>/<protocol>...]  

指定容器运行时对外暴露的端口,但是该指定实际上不会发布该端口,它的功能是镜像构建者和容器运行者之间的记录文件。

回到容器命令中的 run 命令部分,run 命令有 -p 和 -P 两个参数。

如果是 -P 就是随机端口映射,容器内会随机映射到 EXPOSE 指定的端口;如果是 -p 就是指定端口映射,告诉运维人员容器内需要映射的端口号。

11、CMD

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

指定容器启动时默认运行的命令,在一个 Dockerfile 文件中,如果有多个 CMD 命令,只有一个最后一个会生效!

12、ENTRYPOINT

  1. ENTRYPOINT["executable""param1""param2"]  
  2.  ENTRYPOINT command param1 param2  

这个指令与 CMD 指令类似,都是指定启动容器时要运行的命令,如果指定了 ENTRYPOINT,则 CMD 指定的命令不会执行!

在一个 Dockerfile 文件中,如果有多个 ENTRYPOINT 命令,也只有一个最后一个会生效!不同的是通过 docker run command 命令会覆盖 CMD 的命令!

执行的命令不会覆盖 ENTRYPOINT,docker run 命令中指定的任何参数都会被当做参数传递给 ENTRYPOINT!

RUN、CMD、ENTRYPOINT 区别:

---RUN 指令是在镜像构建时运行,而后两个是在容器启动时执行!

---CMD 指令设置的命令是容器启动时默认运行的命令,如果 docker run 没有指定任何的命令,并且 Dockerfile 中没有指定 ENTRYPOINT,那容器启动的时候就会执行 CMD 指定的命令!有点类似代码中的缺省参数!

---如果设置了 ENTRYPOINT 指令,则优先使用!并且可以通过 dockerrun 给该指令设置的命令传参!

---CMD 有点类似代码中的缺省参数。

13、USER

  1. USER <user>[:<group>]  
  2.   USER <UID>[:<GID>]  

用于指定运行镜像所使用的用户。

14、ARG

  1. ARG <name>[=<defaultvalue>]  

指定在镜像构建时可传递的变量,定义的变量可以通过 dockerbuild --build-arg = 的方式在构建时设置。

15、ONBUILD

  1. ONBUILD [INSTRUCTION]  

当所构建的镜像被当做其他镜像的基础镜像时,ONBUILD 指定的命令会被触发!

16、STOPSIGNAL

  1. STOPSIGNAL signal  

设置当容器停止时所要发送的系统调用信号!

17、HEALTHCHECK

  1. HEALTHCHECK [OPTIONS] CMD command (在容器内运行运行命令检测容器的运行情况)  
  2. HEALTHCHECK NONE (禁止从父镜像继承检查)  

该指令可以告诉 Docker 怎么去检测一个容器的运行状况!

18、SHELL

  1. SHELL ["executable","parameters"]  

用于设置执行命令所使用的默认的 Shell 类型!该指令在 Windows 操作系统下比较有用,因为 Windows 下通常会有 CMD 和 Powershell 两种 Shell,甚至还有 SH。

以上就是Dockerfile的相关指令,既然对这些指令有了大概的了解,那么怎么来构建呢?当然使用Docker提供的构建命令:docker build [OPTIONS] PATH | URL | -

-f:指定要使用的 Dockerfile 路径,如果不指定,则在当前工作目录寻找 Dockerfile 文件!

-t:镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。

看看redis和nodejs的Dockerfile长什么样:

Dockerfile:Docker中构建镜像用到的文本文档

 

Dockerfile:Docker中构建镜像用到的文本文档

 

责任编辑:华轩 来源: 今日头条
相关推荐

2011-03-28 16:32:02

Oracle数据文本文档查询

2021-11-09 14:08:45

DockerDockerfileJava

2021-09-02 11:55:57

Dockerfile文Linux

2019-09-17 09:44:45

DockerHTMLPython

2014-11-18 10:37:15

dockerlinux技巧

2023-09-12 08:03:49

容器镜像

2020-11-03 16:42:46

容器Dockerfile技术

2015-01-08 15:18:43

DockerDockerFile创建镜像

2021-05-13 23:54:12

DockerDockerfile镜像

2024-03-06 18:11:06

Docker镜像技术

2017-11-13 17:17:11

Docker镜像Go

2022-08-04 18:30:59

DockerfileDocker 镜像Linux

2022-09-06 10:39:38

Docker镜像构建

2017-03-24 09:24:21

HarborDocker镜像仓库

2024-02-20 08:08:43

2016-08-22 16:12:27

DockerWeb服务器API

2023-08-04 08:20:56

DockerfileDocker工具

2021-02-23 15:05:55

Docker镜像开发

2022-07-15 14:54:00

DockerLinux技巧

2023-06-08 07:37:42

Docker容器
点赞
收藏

51CTO技术栈公众号