Dockerfile文件详解

2023-05-16

什么是dockerfile?

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。

docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。

例:


docker build -f /path/to/a/Dockerfile  

Dockerfile的基本结构

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

Dockerfile文件说明

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以字符开头则被视为注释。可以在Docker文件中使用RUNCMDFROMEXPOSEENV等指令。

在这里列出了一些常用的指令。

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


格式:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>
示例:
  FROM mysql:5.6
注:
  tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像  

MAINTAINER: 维护者信息


格式:
    MAINTAINER <name>
示例:
    MAINTAINER Jasper Xu
    MAINTAINER sorex@163.com
    MAINTAINER Jasper Xu <sorex@163.com>  

RUN:构建镜像时执行的命令


RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
    RUN <command>
exec执行
格式:
    RUN ["executable", "param1", "param2"]
示例:
    RUN ["executable", "param1", "param2"]
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]
注:
  RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache  

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


格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
    ADD hom* /mydir/          # 添加所有以"hom"开头的文件
    ADD hom?.txt /mydir/      # ? 替代一个单字符,例如:"home.txt"
    ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/  

COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

CMD:构建容器后调用,也就是在容器启动时才进行调用。


格式:
    CMD ["executable","param1","param2"] (执行可执行文件,优先)
    CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2 (执行shell内部命令)
示例:
    CMD echo "This is a test." | wc -
    CMD ["/usr/bin/wc","--help"]
注:
   CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。  

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


格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
示例:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
注:
   ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。  

LABEL:用于为镜像添加元数据


格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
  LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
  使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。  

ENV:设置环境变量


格式:
    ENV <key> <value>  #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
    ENV <key>=<value> ...  #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
    ENV myName John Doe
    ENV myDog Rex The Dog
    ENV myCat=fluffy  

EXPOSE:指定于外界交互的端口


格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080
    EXPOSE 11211/tcp 11211/udp
注:
  EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口  

VOLUME:用于指定持久化目录


格式:
    VOLUME ["/path/to/dir"]
示例:
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
注:
  一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它  

WORKDIR:工作目录,类似于cd命令,目录不存在会自动创建


格式:
    WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (这时工作目录为/a)
    WORKDIR b  (这时工作目录为/a/b)
    WORKDIR c  (这时工作目录为/a/b/c)
注:
  通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。  

USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且需要在之前创建所需要的用户


格式:
  run groupadd -r user && useradd -r -g user # -r 建立系统帐号   USER user   USER user:group   USER uid   USER uid:gid   USER user:gid   USER uid:group 示例:   USER www 注:   使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过
-u参数来覆盖所指定的用户。

ARG:用于指定传递给构建运行时的变量


格式:
    ARG <name>[=<default value>]
示例:
    ARG site
    ARG build_user=www  

ONBUILD:用于设置镜像触发器


格式:
  ONBUILD [INSTRUCTION]
示例:
  ONBUILD ADD . /app/src
  ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
  当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发  

以下是一个小例子:


# This my first nginx Dockerfile
# Version 1.0

# Base images 基础镜像
FROM centos

#MAINTAINER 维护者信息
MAINTAINER xxxx 

#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  

#RUN 执行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0 

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#CMD 运行以下命令
CMD ["nginx"]  

最后用一张图解释常用指令的意义^-^

 

 

转:https://www.cnblogs.com/panwenbin-logs/p/8007348.html

转载于:https://www.cnblogs.com/linyouyi/p/11407875.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dockerfile文件详解 的相关文章

  • Docker compose 和外部镜像多阶段构建

    I use Docker 多阶段构建 https docs docker com develop develop images multistage build 具体来说 使用外部图像作为 舞台 当使用多阶段构建时 您 不限于从您之前创建的
  • 使用 --tag 的 Docker 构建命令无法标记图像

    我尝试使用本地可用的 Dockerfile 构建 Docker 映像 docker build t newimage 我之前也多次使用过这个命令 但不知何故它目前不起作用 我一直在寻找它的原因 如果有人可以帮助我找到可能的解决方案或可能的区
  • CMD 不在 Dockerfile 中的 ENTRYPOINT 之后运行

    所以我有一个 docker 文件 它可以执行以下操作 ENV ENV ENV ENV SERVICE NAME SERVICE NAME USER app ENV HOME home app COPY target home app tar
  • 如何将 GitLab CI 文件变量传递给 Dockerfile 和 docker 容器?

    GitLab CI 允许向项目添加自定义变量 它允许使用类型的秘密变量file我指定的键是变量名称 值是文件的内容 例如证书的内容 然后在管道执行期间 内容将被保存为临时文件 调用变量名称将返回创建文件的路径 最终我需要将此文件复制到构建项
  • 使用 docker 和 --privileged 构建

    我在用着本指南 https aws amazon com blogs ai build a voice kit with amazon lex and a raspberry pi 使用 Amazon Lex 和 Raspberry Pi
  • docker python 自定义模块未找到

    我是 docker 新手 正在尝试将一个简单的应用程序移至 docker 我可以使用 pip install 导入Python标准模块 但是 我有一些想要使用的自定义 python 实用程序文件 这些文件位于单独的包 utils 中 在我的
  • 在 python docker 镜像上使用 GPU

    我正在使用一个python 3 7 4 slim busterdocker 镜像 我无法更改它 我想知道如何使用我的英伟达 GPU on it 我通常用一个tensorflow tensorflow 1 14 0 gpu py3并用一个简单
  • 部署到 Docker 时外部化 Spring Boot 属性

    在我的 Spring Boot 应用程序中 我想将属性外部化以在 Docker 容器中运行 首次部署时 当前的属性my server src main resources application yml由应用程序按预期加载和使用 一切正常
  • docker run 使用包含变量的 ENTRYPOINT

    我有一个私人 git 存储库github com http github com我想自动化docker build过程使用Dockerfile 我天真地认为最好的地方Dockerfile位于我的存储库的根文件夹中 例子 git clone
  • /var/run/docker.sock:在 Python CGI 脚本中运行 docker 时权限被拒绝

    我正在尝试运行 Python CGI 脚本 在其中需要运行 docker 镜像 我使用的是 Docker 版本 1 6 2 用户是 www data 添加到docker组中 www data www data sudo docker 在机器
  • 运行 Docker 映像时传递可选参数

    我有一个基于 windowsservercore 的 Docker 文件 我正在托管一个 ASP net Core Web 应用程序 docker 文件中的片段 ENTRYPOINT my exe ENV ASPNETCORE URLS h
  • Dockerfile“RUN chmod”未生效

    其他一切都生效 但权限没有改变 我错过了什么吗 FROM joomla 3 9 php7 2 apache RUN apt get update apt get install y apt utils vim curl COPY jooml
  • 如何在 Dockerfile 中添加除隐藏目录(如 .git)之外的所有文件/目录

    我们经常做的一件事就是将所有源代码打包在Dockerfile当我们构建 Docker 镜像时 ADD app 我们怎样才能避免包括 git目录以简单的方式 我尝试使用 Unix 方式来处理这个问题ADD app 完整样本 docker bo
  • yum update / apk update / apt-get update 在代理后面不起作用

    我使用代理 无法构建 Docker 映像 我尝试过FROM ubuntu FROM centos and FROM alpine but apt get update yum update apk update failed 我的主机操作系
  • 为多个 python 应用程序重用 Docker 镜像

    我对 Docker 的整个世界都很陌生 实际上 我正在尝试为不同的 python 机器学习应用程序建立一个环境 这些应用程序应该在自己的 docker 容器中相互独立地运行 由于我并不真正理解使用基础映像并尝试扩展这些基础映像的方式 因此我
  • 在docker镜像中运行多个脚本

    您好 我想知道是否可以在 docker 容器启动时自动同时运行两个脚本 第一个脚本必须运行客户端应用程序 第二个脚本必须运行服务器应用程序作为后台 You can use CMD在你的Dockerfile https docs docker
  • apt-get install tzdata 非交互式

    当我尝试 apt get install y tzdata 将显示用于选择时区的命令行选项 我试图在脚本中使用它来进行一些设置 如何在没有用户输入的情况下使 apt get 运行 我知道重新配置 tzdata 我可以做 echo Ameri
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My
  • 如何将“npm install”集成到 ASP.NET CORE 2.1 Docker 构建中

    我还没有找到一种方法来构建 ASP NET Core 2 1 Docker 映像 同时执行正确的操作npm install在构建过程中 My Dockerfile看起来像这样 从 Visual Studio 生成的 FROM microso
  • 在 mkdir 之后触摸文件时构建 Dockerfile 失败

    我是 Docker 新手 尝试使用简单的 Dockerfile 构建映像 FROM jenkins USER root RUN mkdir pv home a b RUN touch home a b test txt RUN mkdir

随机推荐

  • Python startswith()函数 与 endswith函数

    函数 xff1a startswith 作用 xff1a 判断字符串是否以指定字符或子字符串开头 一 函数说明 语法 xff1a string startswith str beg 61 0 end 61 len string 或strin
  • [C++]Leetcode超高效刷题顺序及题目详解笔记(持续更新中)

    一 前言 博主最近在LeetCode上用C 43 43 练习 一路走来踩过一些坑 xff0c 做了一些总结和笔记 xff0c 分享给需要的人 LeetCode中文版 xff1a https leetcode cn com 二 介绍 Leet
  • Win10加装SSD固态硬盘后卡顿现象的解决方法

    现象 xff1a 1 不定期出现卡顿 xff0c 或开机直接卡顿 xff0c 移动鼠标一下一下卡顿 xff0c 听歌曲看视频亦是一下一下卡顿 xff0c 非假死或死机 2 硬盘占用率正常 xff0c CPU占用率正常 xff0c 内存占用率
  • PX4/Pixhawk---高速成为开发人员(Windows)

    1 高速成为开发人员新手教程 xff08 翻译 xff09 官方 1 1 编译环境之版本号控制系统 xff08 1 xff09 安装 MSysGIT 安装完毕后 xff0c 配置GIT 安装注意 安装过程中除了以下一步外 xff0c 其它的
  • iOS 变量名前为什么要加_下划线

    简单来说 xff0c 含有两个下划线和下划线 43 大写字母开头的标识符是给编译器和标准库用的 xff0c 你不能用 xff0c 否则后果自负 一个下划线开头的随便用 xff0c 只要你不嫌麻烦 而我们一般在前面加 表示私有变量 一般来说
  • VINS-mono详细解读

    VINS mono详细解读 极品巧克力 前言 Vins mono是香港科技大学开源的一个VIO算法 xff0c https github com HKUST Aerial Robotics VINS Mono xff0c 是用紧耦合方法实现
  • 从阿里到微店

    从阿里到微店 标签 xff1a 程序人生 在 lt 2 5年 从0到阿里 gt 中提到过 当时面阿里云OS时预期的是进入虚拟机团队 结果后来被分到了高通平台参考设计团队 因此在阿里期间心情一直是比较低落的 写这篇博客主要是基于以下几个原因
  • 旷视研究院Detection组负责人

    http www skicyyu org https zhuanlan zhihu com p 61910297 俞刚 xff0c 旷视研究院Detection组负责人 2014年博士毕业于新加坡南洋理工大学 xff0c 加入旷视 主要负责
  • FIFO队列(First In First Out)和优先队列

    queue lt 类型名 gt q q size 返回队列中元素个数 q empty 若队列为空 xff0c 返回true xff0c 否则返回false q pop 删除队首元素 xff0c 但不返回其值 q front 返回队首元素的值
  • profile, bashrc, source, setup.*sh

    一 source xff1a 命令是使该文件立刻执行 xff0c 这样刚才做的修改就可以立即生效了 xff0c 否则要重新启动系统修改才能生效 执行其后命令使之立即生效 xff0c 不用重启 二 bashrc 1 linux系统 xff1a
  • mysql数据库引擎

    一 innodb 1 支持事务 事务ACID atomicity原子性 consistency一致性 isolation隔离性 durability持久性 A xff1a 事务要么全执行 xff0c 要么全不执行 C xff1a 事务执行前
  • HashMap

    实现Map 存储 lt key value gt 的集合 xff0c 每个键值对叫做Entry HashMap每一个元素的初始值都是Null 1 put方法 1 xff09 需要利用哈希函数来确定Entry的插入位置index 61 Has
  • 华为发布全新AI平台:第三代开发板HiKey 970

    3月19日 xff0c 在香港Linaro开发者大会上 xff0c 华为发布了全球领先的人工智能开发平台 HiKey 970 xff0c 基于全球首个内置NPU神经网络单元的AI移动计算平台麒麟970 xff0c 可提供强大AI算力 支持硬
  • 程序员你写的代码,被爆出黑产了!

    事件经过 看了微博上发表转发1000 43 点赞1000 43 次的吐槽陕西省的普通话成绩查询网站代码的微博 xff0c 后来知乎上又有20万的阅读量这个话题的提问 最终结案这并不是真的陕西省普通话成绩查询网的网址 xff0c 只不过是和官
  • vue 常见的新增、编辑、查看公用同一个页面

    用vue开发经常会碰到 xff0c 一个功能的新增 编辑 查看公用同一个页面 xff0c 如果是页面暂且不提 但是弹框 xff0c 很多人会发现 xff0c 如果是点击编辑 xff0c 取消 xff0c 再点新增 xff0c 弹框上面是会有
  • 关于 sinc函数和rect函数 傅里叶变换的思考

    sinc型和rect型 只要零点确定 Ts 61 a 2 那么带宽是相同的 xff0c B 61 1 a 只是频率概率密度不一样 sinc 函数的频谱是一个矩形 xff0c 也就是说频率概率是一样的 xff1b rect函数的频谱是一个si
  • Revit安装失败怎样卸载重新安装Revit,解决Revit安装失败的方法总结

    技术帖 xff1a Revit没有按照正确方式卸载 xff0c 导致Revit安装失败 楼主也查过网上关于如何解决Revit安装失败的一些文章 xff0c 是说删除几个Revit文件和Revit软件注册表就可以解决Revit安装失败的问题
  • make问题:make[1] entering directory

    make问题 xff1a make 1 entering directory 执行make distclean命令 posted on 2014 07 16 07 48 一生学习 何来毕业 阅读 评论 编辑 收藏 转载于 https www
  • 关于TIA博图V13的超详细WIN10安装教程(STEP 7 V13、wincc V13、PLCSIM)

    博途V13全部 含激活 xff08 STEP 7 V13 wincc V13 PLCSIM xff09 xff1a 百度云盘下载 提取码 xff1a m6ve 注意 注意安装顺序先安装STEP 7 V13 在安装wincc V13 最后在安
  • Dockerfile文件详解

    什么是dockerfile Dockerfile是一个包含用于组合映像的命令的文本文档 可以使用在命令行中调用任何命令 Docker通过读取Dockerfile中的指令自动生成映像 docker build命令用于从Dockerfile构建