ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Dockerfile的指令和编写

2022-05-08 21:01:45  阅读:234  来源: 互联网

标签:示例 jar VOLUME ADD 指令 ENTRYPOINT 镜像 编写 Dockerfile


每个优秀的人,背后都有一段沉默的时光

前言

学习Docker基础知识

什么是Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明

指令说明

Dockerfile 的指令摘要
	FROM- 镜像从那里来
	MAINTAINER- 镜像维护者信息
	RUN- 构建镜像执行的命令,每一次RUN都会构建一层
	CMD- 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数
	VOLUME- 定义数据卷,如果没有定义则使用默认
	USER- 指定后续执行的用户组和用户
	WORKDIR- 切换当前执行的工作目录
	HEALTHCHECH- 健康检测指令
	ARG- 变量属性值,但不在容器内部起作用
	EXPOSE- 暴露端口
	ENV- 变量属性值,容器内部也会起作用
	ADD- 添加文件,如果是压缩文件也解压
	COPY- 添加文件,以复制的形式
	ENTRYPOINT- 容器进入时执行的命令

FROM

说明:FROM是指定基础镜像,必须为第一个命令

语法:
	FROM <image>:<tag>

示例:
	FROM mysql:5.7

RUN

说明:RUN 用来执行构建镜像时执行的命令,有以下两种命令执行方式

语法:
	`shell` 执行格式:
		RUN <command>
	`exec` 执行格式:
		RUN ["executable", "param1", "param2"]

示例:
	`shell`格式:
		RUN apk update
	`exec`格式:
		RUN ["/dev/file", "p1", "p2"]

COPY

说明:复制指令,从上下文目录中复制文件或者目录到容器里指定路径

语法:
	COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
	COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]
	
	**[--chown=<user>:<group>]**:可选参数,用户改变复制到容器内文件的拥有者和属组。
	**<源路径>**:源文件或者源目录,这里可以是通配符表达式。
	**<目标路径>**:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
	
示例:
	COPY hom* /mydir/
	COPY hom?.txt /mydir/

ADD

说明:ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。
COPY不同之处:

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
语法:
	ADD <src>... <dest>
	# 用于支持包含空格的路径
	ADD ["<src>",... "<dest>"]

示例:
	ADD home _/path/ # 支持通配符_ 添加所有以"home"开头的文件 到/path/ 下

EXPOSE

说明:EXPOSE 指定与外界交互的端口
作用:

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
语法:
	EXPOSE <端口1> [<端口2>...]

示例:
	EXPOSE 8080 443

ENV 指令

说明:ENV 用来设置环境变量

语法:
	ENV <key> <value> # 之后的所有内容均会被视为其的组成部分,因此,一次只能设置一个变量
	ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"="的键值对,如果中包含空格,可以使用\来进行转义,也可以通过""来进行标识;另外,`\` 也可以用于续行

示例:
	ENV version 1.0.0
	ENV version=1.0.0

CMD

说明:CMD 构建容器后执行的命令,也就是在容器启动时才执行的命令。

语法:
	# 执行可执行文件,优先执行
	CMD ["executable","param1","param2"]
	
	# 设置了 ENTRYPOINT,则直接调用ENTRYPOINT添加参数  参见 CMD 讲解
	CMD ["param1","param2"]
	
	# 执行shell命令
	CMD command param1 param2

示例:
	CMD ["/usr/bin/bash","--help"]

WORKDIR

说明:WORKDIR 用来指定工作目录,类似于我们通常使用的cd 命令

语法:
	WORKDIR <PATH>

示例:
	WORKDIR /user/local

VOLUME

说明:VOLUME 用于指定持久化目录

语法:
	VOLUME ["<路径1>", "<路径2>"...]
	VOLUME <路径>
	# 在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点
	
示例:
	VOLUME ["/data"]
	VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]

ENTRYPOINT

说明:ENTRYPOINT 用来配置容器,使其可执行化。配合 CMD可省去 application,只使用参数。

语法:
	# 可执行文件, 优先
	ENTRYPOINT ["executable", "param1", "param2"]
	# shell内部命令
	ENTRYPOINT command param1 param2

示例:
    ENTRYPOINT ["top", "-b"]

LABEL

说明:LABEL:用于为镜像添加元数据,多用于声明构建信息,作者、机构、组织等。

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

示例:
	LABEL version="1.0" description="felord.cn" by="Felordcn"

Dockerfile编写

示例1

# 使用 aws 的java jdk 8
FROM amazoncorretto:8
# 作者等相关的元信息
LABEL AUTHOR=Felordcn OG=felord.cn
# 挂载卷
VOLUME ["/tmp","/logs"]
# 时区
ENV TZ=Asia/Shanghai
# 启用配置文件 默认为 application.yml
ENV ACTIVE=defualt
# 设置镜像时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 修改为打包后的jar文件名称
ADD /target/flyway-spring-boot-1.0.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=${ACTIVE}","-jar","app.jar"]

示例2

# Docker image for springboot file run
# VERSION 0.0.1
# Author: eangulee
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER eangulee <tom@gmail.com>
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp 
# 将jar包添加到容器中并更名为app.jar
ADD cloud-test-1.0-SNAPSHOT.jar app.jar 
# 运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]

总结

本文记录了dockerfile的指令使用及说明,另外和两个springboot项目dockerfile的示例

标签:示例,jar,VOLUME,ADD,指令,ENTRYPOINT,镜像,编写,Dockerfile
来源: https://www.cnblogs.com/oneronan/p/16246872.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有