Dockerfile 详解

2023-05-16

Dockerfile 详解

在这里插入图片描述

一、Dockerfile概述

Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像。

Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。一般而言,Dockerfile 分为四部分:基础镜像信息维护者信息镜像操作指令容器启动时执行指令

二、构建镜像命令

1、命令:docker build

2、作用:将 Dockerfile 文件构建成镜像

3、语法:docker build -f 文件名 -t 镜像名称:版本 .

. 代表 Dockerfile 文件在当前路径

-f 可以指定 Dockerfile 文件名,一般文件名为 Dockerfile

-t 可以定义镜像名称以及版本

注意:构建镜像一般是在 Dockerfile 文件所在的目录去构建的

[root@localhost opt]# vim Dockerfile 
    FROM openjdk:8
    MAINTAINER huhai
    CMD echo "Hello Doker!"
[root@localhost opt]# docker build -t test:1.0 .
Sending build context to Docker daemon 618.2 MB
Step 1/3 : FROM openjdk:8
 ---> b273004037cc
Step 2/3 : MAINTAINER c
 ---> Running in 515cebaac130
 ---> 12c10f87abc6
Removing intermediate container 515cebaac130
Step 3/3 : CMD echo "Hello Doker!"
 ---> Running in 12e0b57f87e5
 ---> 837916b31a37
Removing intermediate container 12e0b57f87e5
Successfully built 837916b31a37
[root@localhost opt]# docker run -it test:1.0
Hello Doker
#-f可以使用指定的Dockerfile文件名
[root@localhost opt]# docker build -f Dockerfile02 -t test:2.0 .
......
#在其他目录构建报错
[root@localhost home]# docker build -f /opt/Dockerfile02 -t test:3.0 .
unable to prepare context: The Dockerfile (/opt/Dockerfile02) must be within the build context (.) #Dockerfile必须在构建上下文中

三、常见的13种指令

1、FROM

1)指令作用:指定基础镜像,必须为第一个命令

2)指令格式:FROM 镜像名称:版本(若不指定版本则默认使用 latest 版本)

FROM openjdk:8

2、MAINTAINER

1)指令作用:指定维护者信息

2)指令格式:MAINTAINER 维护者信息

维护者信息可为名字,也可为邮箱,也可为名字加邮箱

MAINTAINER huhai
MAINTAINER huhai<huhai@qq.com>

3、RUN

1)指令作用:构建镜像时执行的命令

2)指令格式:

​ shell 格式:RUN 命令

​ exec 格式:RUN [“可执行文件”,“参数1”,“参数2”]

RUN 指令创建的中间镜像会被缓存,并在下次构建汇中使用。在构建时使用 --no-cache 参数可以不使用缓存镜像,如:docker build --no-cache

RUN mkdir docker
RUN echo "test" > test.info

4、CMD

1)指令作用:构建容器后调用,即在容器启动时才进行调用

2)指令格式:

​ shell 格式:CMD 命令

​ exec 格式:CMD [“可执行文件”,“参数1”,“参数2”]

CMD 与 RUN 的不同点:

CMD 用于指定在容器启动时所要执行的命令,而 RUN 用于指定镜像构建时所要执行的命令

CMD echo "Hello Dockerfile!"
CMD ["/usr/bin/wc",“--help”]

5、WORKDIR

1)指令作用:指定工作目录,类似于 cd 命令

2)指令格式:WORKDIR 目录名

通过 WORKDIR 命令设置工作目录后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。

在使用 docker run 运行容器时,可以通过 -w 参数覆盖构建时所设置的工作目录。

WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)

WORKDIR /opt
RUN mkdir docker

6、ADD

1)指令作用:将本地文件添加到容器中,tar 类型的文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似于 wget

2)指令格式:ADD 宿主机文件位置 容器中文件位置

可以使用模糊查询添加多个符合条件的文件,例如:ADD hello* /opt,添加所有 hello 开头的文件

ADD /opt/apache-tomcat-8.5.27.tar.gz /opt

7、COPY

1)指令作用:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源。

2)指令格式:COPY 宿主机路径 容器内路径

COPY ./start.sh /start.sh

8、ENTRYPOINT

1)指令作用:配置容器,使其可执行化。指定容器启动时要运行的命令,可以追加命令,与 CMD 一样,但有不同之处

2)指令格式:

​ ENTRYPOINT [“可执行文件”,“参数1”,“参数2”]

​ ENTRYPOINT 命令 参数1 参数2(shell内部命令)

通过 docker run 执行的命令不会覆盖 ENTRYPOINT,而 docker run 命令中指定的任何参数,都会被当做参数再次传递给 ENTRYPOINT 。

Dockerfile 中只允许有一个 ENTRYPOINT 命令,多指定时会覆盖前面的设置,而只执行最后的 ENTRYPOINT 指令。

二者区别:

  • CMD #指定这个容器启动的时候要运行的命令,可被替换
  • ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ENTRYPOINT ["top","-b"]

9、ENV

1)指令作用:用于设置环境变量,下面指令和容器中的程序都可以使用此处定义的环境变量

2)指令格式:ENV key=value

一次只能设置一个变量,但可以设置多个变量,每个变量为一个 key=value 的键值对

如果 key 中包含空格,可以使用 \ 来进行转义,也可以通过 “” 来进行标示

反斜线也可以用于续行

ENV JAVA_HOME=/usr/local/jdk1.8.0_333
ENV PATH=$JAVA_HOME/bin:$PATH

10、EXPOSE

1)指令作用:指定与外界交互的端口

2)指令格式:EXPOSE 端口号

EXPOSE 并不会让容器的端口访问到主机。要使其可访问,需要在 docker run 运行容器时通过 -p 参数来发布这些端口。

EXPOSE 8080

11、VOLUME

1)指令作用:用于指定持久化目录

2)指令格式:VOLUME [“挂载卷地址”,…]

一个卷可以存在于一个或多个容器的指定目录,改目录可以绕过联合文件系统,并具有一下功能:

  • 卷可以容器间共享和重用
  • 容器并不一定要和其它容器共享卷
  • 修改卷后会立即生效
  • 对卷的修改不会对镜像产生影响
  • 卷会一直存在,直到没有任何容器在使用它
VOLUME ["/opt/my_data"]
VOLUME ["/opt/my_data","/opt/test"]

12、USER

1)指令作用:以什么用户去运行

2)指令格式:USER 用户

使用 USER 指定用户后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT 都将使用该用户

镜像构建完成后,通过 docker run 运行容器时,可以通过 -u 参数来覆盖所指定的用户

13、ONBUILD

1)指令作用:帮助其他容器生成,即指令后的命令不在此次镜像构建中运行,会在其他继承此镜像的镜像中运行

2)指令格式:ONBUILD 其他指令

FROM centos
WORKDIR /data
ONBUILD RUN mkdir test

#test:1.0为上面Dockerfile文件构建
FROM test:1.0

四、Dockerfile构建Tomcat镜像实战

#基础镜像
FROM java:8
#维护者信息
MAINTAINER huhai
#拷贝tomcat包
ADD /opt/apache-tomcat-8.5.27.tar.gz /usr/local
#设置工作目录
WORKDIR /usr/local
#设置环境变量
ENV TOMCAT_HOME=/usr/local/apache-tomcat-8.5.27
ENV PATH=$PATH:$TOMCAT_HOME/bin
#保留端口
EXPOSE 8080
#启动容器命令
CMD startup.sh && tail -F /usr/local/apache-tomcat-8.5.27/bin/catalina.bat
[root@localhost opt]# docker build -t tomcat:1.0 .
[root@localhost opt]# docker run -d --name my_tomcat -p 8080:8080 tomcat:1.0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dockerfile 详解 的相关文章

随机推荐

  • 1. 403 错误 html

    目录 1 效果图 2 code 3 使用 1 效果图 2 code lt DOCTYPE html gt lt html lang zh gt lt head gt lt meta charset utf 8 gt lt title gt
  • linux vi/vim命令学习

    一 依据个人理解 xff0c vi和vim主要有以下几点区别 xff1a 1 vim命令编辑脚本时 xff0c 能够检查出一些基本的语法错误 xff0c 比如括号匹配等 xff0c vi命令不具有这一功能 2 一般linux系统安装时都是自
  • 2. 404 错误 html

    目录 1 效果图 2 code 3 使用 1 效果图 2 code lt DOCTYPE html gt lt html gt lt head gt lt meta charset utf 8 gt lt title gt 404 lt t
  • 3. 500 服务器异常 html

    目录 1 效果图 2 code 1 效果图 2 code lt DOCTYPE html gt lt html gt lt head gt lt meta charset utf 8 gt lt title gt 500 lt title
  • 蓝桥杯之单片机学习(三)——共阳数码管的静态显示

    文章目录 一 训练任务二 训练重点三 训练准备3 1 原理图展示3 2 数字对照表3 3 数码管分路3 4 一些解释 四 代码实现注意事项 一 训练任务 在CT107D单片机综合训练平台上 xff0c 8个数码管分别依次显示0 9的值 xf
  • Dockerfile 定制专属镜像|果断收藏

    前言 大家好 xff0c 本文是对 Docker 自定义镜像的详细讲解 xff0c 讲解了如何进行构建自己的 Docker 镜像以及 Dockerfile 的操作指令 希望对大家有所帮助 一 使用 Dockerfile 定制镜像 1 1 D
  • 蓝桥杯python组练题第六天——七段码——蓝桥杯官网题库

    单词分析 题目描述 本题为填空题 xff0c 只需要算出结果后 xff0c 在代码中使用输出语句将所填结果输出即可 不建议写代码 小蓝要用七段码数码管来表示一种特殊的文字 上图给出了七段码数码管的一个图示 xff0c 数码管中一共有 7 段
  • Ubuntu22.04开机网络无法连接,ping不通解决方案

    从前天开始 xff0c 虚拟机不知道为什么开机之后就无法联网 xff0c 也ping不通 xff0c 而且ifconfig显示我只有lo 没有ens33 xff0c 之后就开始找解决方案 失败的方案有很多 xff0c 比如 xff1a 重置
  • 计蒜客 T1096 石头剪刀布--C语言

    计蒜客 T1096 石头剪刀布 题目 石头剪刀布是常见的猜拳游戏 石头胜剪刀 xff0c 剪刀胜布 xff0c 布胜石头 如果两个人出拳一样 xff0c 则不分胜负 一天 xff0c 小 AA 和小 BB 正好在玩石头剪刀布 已知他们的出拳
  • AT89C52流水灯+外部中断INT0+定时器(汇编语言)

    AT89C52流水灯 43 外部中断INT0 43 定时器 xff08 汇编语言 xff09 任务要求 用 AT89S52 单片机控制彩灯 xff08 流水灯 xff09 图形及继电器 即 xff1a AT89S52 单片机上电时控制由发光
  • 【Verilog】通过任务(task)完成3个8bit数据的冒泡排序

    题目 xff1a 设计一个模块 xff0c 通过任务完成3个8位2进制输入数据的冒泡排序 要求 xff1a 时钟触发任务的执行 xff0c 每个时钟周期完成一次数据交换的操作 Verilog代码 xff1a module sort inpu
  • 官网下载JAVA的JDK11版本(下载、安装、配置环境变量)

    目录 前言必读 xff1a 一 下载JDK11 1 先去浏览器搜索 2 选择Products 3 Java 4 往下滑找到Oracle JDK 然后点击 5 往下滑找到Java11 xff0c 再选择自己的操作系统 6 选择exe这个直接安
  • linux命令学习之————ls,pwd,cd,hostnamectl,systemctl

    这几条命令之间没有什么联系 xff0c 随便写写 一 ls命令 1 显示当前目录下所包含的文件或目录名 xff1a ls 2 显示当前目录下所包含的文件或目录的详细信息 xff1a ls l 3 显示当前目录下所包含的文件或目录的详细信息
  • win10系统重装(超简单)

    目录 前言 操作步骤 第一步 xff1a 格式化硬盘 第二步 xff1a 硬盘重新分区 固态硬盘分区 机械硬盘分区 完成效果展示 第三步 xff1a 把ISO镜像文件写入固态硬盘 第四步 xff1a 关机拔u盘 第五步 xff1a 开机重装
  • 字符串中数据的排序

    题目 xff1a 有一个字符串 xff1a 91 27 46 38 50 xff0c 请写程序实现最终输出结果 xff1a 27 38 46 50 91 思路 xff1a 给数据排序 xff0c 我们首先想到的就是数组的排序方法 xff0c
  • Hadoop的shell命令

    Hadoop的shell命令 启动Hadoop常见的shell命令 与Linux系统命令差不多 xff0c 但小部分有区别 帮助命令 help 显示目录信息 ls 创建文件夹 mkdir 删除文件或文件夹 xff08 rm xff09 移动
  • Arduino连接ESP8266实现联网功能

    目录 1 前期准备 2 ESP8266代码 3 Arduino代码 4 易联智能 由于自己是物联网工程专业的学生 xff0c 所以对于一些单片机等硬件都必须要有一些了解 xff0c 接着这次做课设的机会 xff0c 我打算将自己的这次做课设
  • 7-2远程文件包含漏洞案例讲解和演示

    远程文件包含漏洞测试 远程文件包含漏洞测试 远程文件包含漏洞 远程文件包含漏洞形式跟本地文件包含漏洞差不多 xff0c 都是我们的开发人员在后台使用包含函数的时候 xff0c 没有对它包含的目的地 xff0c 进行相关的安全措施 xff0c
  • Java11的环境配置及注意事项

    1 进入电脑的设置 点击 高级系统设置 点击 环境设置 2 设置参数 2 1新建 JAVA HOME 变量 xff0c 变量值为 xff1a jdk的路径 2 2编辑系统变量中的 path 变量 新建 JAVA HOME bin 变量 3
  • Dockerfile 详解

    Dockerfile 详解 一 Dockerfile概述 Dockerfile 是一个文本格式的配置文件 xff0c 用户可以使用 Dockerfile 快速创建自定义的镜像 Dockerfile 由一行行命令语句组成 xff0c 并且支持