Dockerfile常用指令以及使用案例

Dockerfile常用指令以及使用案例

1、ADD复制文件

	ADD 指令用于复制文件,格式为:
	* ADD  <src>...<dest>
	* ADD ["<src>",..."<dest>"]
	从 src 目录复制文件到容器的 dest。其中 src 可以是Dockerfile 所在目录的相对路径,也可以是一个URL,还可以是一个压缩包。
	
	说明:
	1)src 必须在构建的上下文内,因为 docker build 命令首先会将上下文路径和其子目录发送到 docker daemon。
	2)如果 src 是一个 URL ,同时 dest 不以斜杠结尾,dest 将被视为文件, src 对应内容文件将被下载到 dest 。
	3)如果 src 是一个 URL ,同时 dest 以斜杠结尾,dest 将被视为目录,src 对应内容将被下载到 dest 目录。
	4)如果 src 是一个目录,那么整个目录下的内容将被复制,包括文件系统元数据。
	5)如果文件是可识别的压缩包格式,则 docker 会自动解压。

    例如:ADD   XXXX-0.0.1-SNAPSHOT.jar  app.jar 

2、ARG设置构建参数

   ARG 指令用于设置构建参数。ARG 指令设置的是构建时的环境变量,在容器运行时不会存在这些变量的。
   
   例如:ARG  user1=someuser

3、CMD 容器启动命令

  CMD 指令用于为执行容器提供默认值。每个 Dockerfile 只有一个 CMD 命令,如果指定了多个 CMD 命令,那么只有最后一条会被执行,如果启动容器的时指定了运行的命令,则会覆盖CMD 指定的命令。
  支持 3 种格式:
  1)CMD ["executable","param1","param2"]-----推荐这种方式
  2)CMD ["param1","param2"]  ------为 ENTRYPOINT 指令提供预设参数
  3)CMD command  param1  param2  ------- 在 shell 中执行

4、COPY 复制文件

  复制文件,格式为:
  1)COPY  <src>....<dest>
  2)COPY ["<src>",..."<dest>"]

  复制本地端的 src 到容器的 dest 。COPY指令和 ADD 指令类似,但是 COPY 指令不支持 URL和压缩包。

5、ENTRYPOINT 入口点

 格式为:
 1)ENTRYPOINT  ["executable","param1","param2"]
 2)ENTRYPOINT  command  param1  param2

 ENTRYPOINT 和 CMD 指令的目的一样,都是指定 Docker 容器启动时执行的命令,可多次设置,但只有最后一个有效。

6、ENV 设置环境变量

  ENV 指令用于设置环境变量,格式为:
  1)ENV <key> <value>
  2)ENV <key> = <value>...

   例如: ENV  JAVA_HOME  /path/to/java 

7、EXPOSE 声明暴露的端口

   EXPOSE  指令用于声明在运行时容器提供服务的端口,
   格式为:
   EXPOSE  <port>  [<port>...]

   注意:这里只是一个声明,运行时并不会因为该声明就打开相应的端口。该指令的作用主要是帮助镜像使用者理解该镜像服务的守护端口;其次是当运行时使用随机映射时,会自动映射 EXPOSE 的端口。

  示例:
  EXPOSE   port1    // 声明暴露一个端口
  docker  run  -p  port1  image   // 相应的运行容器使用的命令
  docker  run  -P image  // 使用 -P 选项启动

  EXPOSE  port1   port2  port3  // 声明暴露多个端口
  docker  run  -p  port1   port2  port3  image  // 相应的运行容器使用的命令
  docker  run  -p   host_port1:port1   -p  host_port2:port2   -p  host_port3:port3   image 

8、FROM 指定基础镜像

  使用 FROM 指令指定基础镜像。FROM 指令必须指定且需要写在其他指令之前。FROM 指令后的所有指令都依赖于该指令所指定的镜像。
  支持 3 种格式:
  1)FROM  <image>
  2)FROM  <image>:<tag>
  3)FROM  <image>@<digest>

9、LABEL 为镜像添加元数据

   LABEL 指令用于为镜像添加元数据。

   格式为: LABEL <key> = <value>  <key> = <value>  <key> = <value> ...

   使用 "  "  " 和 "  \ " 转换命令行,例如:
   LABEL  "com...." = "ACME...."
   LABEL   com.x = "foo"
   LABEL   version = "1.0"
   LABEL   description = "This  text  ill \ 
   that  label-values can span  muttiple lines. "

10、MAINTAINER 指定维护者的信息

   MAINTAINER 指令用于指定维护者的信息,用于为 Dockerfile 署名。
   格式为: MAINTAINER  <name>

11、RUN 执行命令

   该指令支持两种格式:
   1)RUN  <command>
   2)RUN  ["executable" , "param1" , "param2"]

12、USER 设置用户

   USER  指令用于设置启动镜像时的用户或者 UID ,写在该指令后的 RUN 、CMD 以及 ENTRYPOINT 指令都将使用该用户执行命令。
   格式为:USER  用户名
   例如:USER   daemon

13、VOLUME 指定挂载点

  VOLUME 指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器。当容器中的应用有持久化数据的需求时可以在 Dockerfile 中使用该指令。
  格式为:VOLUME    ["/data"]
  例如:VOLUME   /data

14 、WORKDIR指定工作目录

	格式为:WORKDIR  /path/to/workdir
	切换目录指令,类似于 cd 命令,写在该指令后的 RUN 、CMD 以及 ENTRYPOINT 指令都将该目录作为当前目录,并执行相应的命令。

15 其他

   扩展内容,可自行阅读 https://docs.docker.com/reference/dockerfile/

16 使用Dockerfile 构建镜像,然后启动、访问服务

   一、准备工作
   		执行下面的命令,将项目构建成 jar 包 :
   		mvn  clean  package    
   	
   二、镜像构建
        1)在 jar 包所在目录,创建名为 Dockerfile 的文件
              touch  Dockerfile 
        2)在 Dockerfile 文件中添加以下内容
              // 基于哪个镜像
              FROM  java:8   
              // 将本地文件夹挂载到当前容器
              VOLUME  /tmp   
              // 复制文件到容器
              ADD   xxxx.jar    app.jar  
              // 声明需要暴露的端口
              EXPOSE  8761  
              // 配置容器启动后执行的命令
              ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]   
         3)使用 docker  build  命令构建镜像
              格式:docker   build   -t   仓库名称/镜像名称(:标签)   Dockerfile 相对位置
              例如:docker   build   -t   itmuch/xxxx:0.0.1  . 

     三、启动镜像
              docker   run   -d    -p   8761:8761  itmuch/xxxx:0.0.1 

     四、访问服务
             http://Docker宿主机IP:8761/
相关推荐
汀、人工智能12 分钟前
修改Docker默认存储路径,解决系统盘占用90%+问题(修改docker root dir)
docker·容器
吃面不喝汤6637 分钟前
如何配置和使用自己的私有 Docker Registry
运维·docker·容器
Leighteen1 小时前
Docker常用命令
docker·容器
丶21361 小时前
【Nginx】在 Docker 上安装 Nginx 的详细指南
运维·nginx·docker
m0_741768858 小时前
使用docker的小例子
运维·docker·容器
最新小梦11 小时前
Docker日志管理
运维·docker·容器
ZHOU西口12 小时前
微服务实战系列之玩转Docker(十五)
nginx·docker·微服务·云原生·swarm·docker swarm·dockerui
lgbisha13 小时前
828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台
低代码·docker·华为云
记得开心一点嘛13 小时前
在Linux系统上使用Docker部署javaweb项目
linux·运维·docker
Persistence is gold15 小时前
cassandra指定配置文件的docker启动方法
运维·docker·容器