Dockerfile自定义制作镜像,其中10个指令的作用分析

news2024/9/20 6:12:20

docker容器中

镜像重要技能。

docker commit只能制作比较简单的镜像,

要制作比较完善的镜像,

自定义程度比较高的,

就需要用到dockerfile

dockerfile可以回溯历史

动态生成镜像。

FROM是基础镜像

CMD是容器创建时候默认的启动命令

CMD是一个数组固定格式

每个参数数组里面元素

/bin/ls   ==>  CMD ["/bin/ls"]
/bin/ls -l -a  ==>  CMD  ["/bin/ls","-l","-a"]
#   ${ENTRYPOINT}  是命令
#   ${@-${CMD}}   是参数
#   ${@} 是所有的参数选项之和
#   $1是第一个参数 
#   $2 是第二个参数
#   ...
#   $n 是第n个参数
#   $@ 是所有的参数之和
#   ${@-} 代表前面的变量没有设置
 ~]# echo  ${AA}

 ~]# echo  ${AA-abc}
abc
#   减号"-"后面代表,前面没有设置的时候,用这个参数
 ~]# AA=123
 ~]# echo  ${AA-abc}
123
#   如果AA设置了,就用设置的值
 ~]# unset AA
 ~]# echo  ${AA-abc}
abc
#   如果把AA设置的值删了,就用减号后面的值了
#   所以
#   ${@-${CMD}的意思就是,如果设置参数了,就用参数,如果没有设置,就用CMD
#   这个CMD就是默认的启动参数,如果没有设置,就用CMD写的命令来启动
#   ENTRYPOINT是,如果设置了,那么CMD就变成选项了。
#   ENTRYPOINT一旦设置了就必须执行
~]# cat  img1 
#!/bin/bash
CMD="/bin/ls -l"
ENTRYPOINT="echo"
${ENTRYPOINT} ${@-${CMD}}
~]# ./img1
/bin/ls -l
 ~]# ./img1  id
id
#  ENTRYPOINT设置echo命令后面CMD变成参数输出屏幕
#  所以ENTRYPOINT设置必须执行
~]# cat myimg/Dockerfile 
FROM  mylinux:latest
ENTRYPOINT ["echo"]
CMD ["/bin/ls", "-l"]
# FROM ENTRYPOINT CMD这三个指令dockerfile里面核心指令

文件扩展名为

.tar

.tar.gz

.tar.bz2

.tar.xz

.tar.tgz

这些类型文件

ADD指令这些文件解压

COPY指令不会解压这些文件

镜像时候所有文件都要放在镜像那个目录里面也就是Dockerfile所在目录

指令

说明

FROM

指定基础镜像

ENTRYPOINT

默认容器启动命令

CMD

有ENTRYPOINT时,CMD是启动参数;没有ENTRYPOINT时,CMD是启动命令;

可以容易被docker run 命令覆盖参数,比如:docker run myimage echo "Good!"

ADD

文件拷贝容器自动解压容器联网下载文件比如 ADD http://www.abc.com/abc.tar /tmp/

COPY

文件拷贝容器解压容器联网不能下载

RUN

容器内执行命令可以多条比如RUN touch file1RUN yum -y install nginx

USER

在容器内切换用户相当于sudo -u user

ENV

设置环境变量某些指令需要环境变量才能正确执行比如etcdctl

export ETCDCTL_API=3

WORKDIR

指定工作目录,有些任务需要,比如ansible、编译./configure

EXPOSE

对外声明容器将要使用端口号和协议,方便健康检测程序进行检测

WORKDIR的用法,比如
RUN touch  f1
WORKDIR /tmp
RUN touch f2     # 在/tmp目录创建f2文件
#通过Dockerfile里面WORKDIR,也可以知悉软件比如源码编译安装nginx WORKDIR /usr/local/nginx

ENTRYPOINT和CMD的单独用法,和结合用法:

  • 只使用 CMD

    • CMD 指定的命令将作为容器启动时的命令。
    • 如果用户没有通过 docker run 指定其他命令,那么 CMD 指定的命令将被执行。
  • 只使用 ENTRYPOINT

    • ENTRYPOINT 指定的命令将作为容器启动时的主程序。
    • 如果用户没有通过 docker run 指定其他命令,那么 ENTRYPOINT 指定的命令将被执行。
    • 当你想定义一个不可轻易覆盖的主程序时,使用 ENTRYPOINT
    • 例如,一个数据库容器可能总是需要运行数据库服务,不允许用户轻易改变这一点。
    • ENTRYPOINT 不容易被覆盖,除非使用 --entrypoint 显式指定。
  • 结合使用 ENTRYPOINT 和 CMD

    • CMD 指定的内容将成为 ENTRYPOINT 指定命令的参数。
    • 如果用户通过 docker run 指定其他命令,这些命令将覆盖 CMD 指定的参数。
# apache镜像,用Dockerfile制作示例:
httpd]# cat Dockerfile 
FROM mylinux:latest
RUN  dnf -y  install  httpd php  && dnf clean all
RUN  sed  -ri -e 's,^Load,#&,'  -e  's,^#(.*mod_mpm_prefork.so)$,\1,'  /etc/httpd/conf.modules.d/00-mpm.conf
ADD  myweb.tar.gz  /var/www/html/
ENV  LANG=C
WORKDIR  /var/www/html
EXPOSE 80/tcp
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]

docker build  -t  httpd:latest  httpd/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2148204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VS code 查看 ${workspaceFolder} 目录指代路径

VS code 查看 ${workspaceFolder} 目录指代路径 引言正文 引言 在 VS code 创建与运行 task.json 文件 一文中我们已经介绍了如何创建属于自己的 .json 文件。在 VS code 中,有时候我们需要添加一些文件路径供我们导入自定义包使用,此时,我们…

Github Wiki 超链接 转 码云Gitee Wiki 超链接

Github Wiki 超链接 转 码云Gitee Wiki 超链接 Github 是 :[[相对路径]] Gitee 是 :[链接文字](./相对路径) 查找:\[\[(.*?)\]\] 替换:[$1]\(./$1\) 或替换:**[$1]\(./$1\)** (码云的超链接,很…

实战18-Card封装

import Card from ../../components/Card/Index; import rvp from ../../utils/resposive/rvIndex;Component export default struct DomesticService {build() {Column() {Card() {//默认插槽Text("DomesticService")}}.width(100%).margin({ top: rvp(43) })} } im…

2024 Python3.10 系统入门+进阶(十五):文件及目录操作

目录 一、文件IO操作1.1 创建或打开文件1.2 读取文件1.2.1 按行读取1.2.2 多行读取1.2.3 完整读取 1.3 写入文件1.3.1 写入字符串1.3.2 写入序列 1.4 上下文管理1.4.1 with语句的使用1.4.2 上下文管理器(拓展----可以学了面向对象之后再回来看) 1.5 文件的遍历 二、os.path模块…

大语言模型-教育方向数据集

大语言模型-教育方向数据集 编号论文数据集1Bitew S K, Hadifar A, Sterckx L, et al. Learning to Reuse Distractors to Support Multiple-Choice Question Generation in Education[J]. IEEE Transactions on Learning Technologies, 2022, 17: 375-390.Televic, NL, https…

79页 PPT华为项目管理经典培训教材(高级)

读者朋友大家好,最近有会员朋友咨询晓雯,需要《79页PPT华为项目管理经典培训教材》资料,欢迎大家文末扫码下载学习。 一、华为项目管理理念方法 (一)项目管理基本概念与方法 项目启动 明确项目目标:华为…

SAP B1 流程实操 - 营销单据销售部分(上)

背景 在 SAP B1 中,最重要的模块就是【销售】,企业可能不涉及生产和库存(贸易公司),甚至不涉及采购(服务业),但是一定会有基本的 销售。本文中我们讲解 销售 模块的基本核心&#x…

【QT】基于HTTP协议的网络应用程序

目录 1 HTTP概述 2 QT中实现高层网络操作的类 3 使用HTTP类请求数据 4 基于HTTP协议的网络文件下载 1 HTTP概述 HTTP(超文本传输协议)是互联网上应用最为广泛的协议之一,它定义了客户端和服务器之间进行通信的规则。HTTP是一种无状态的协议…

rcc 不是内部或外部命令,也不是可运行的程序或批处理文件

D:\Windows Kits\10\bin\10.0.22621.0\x86 将上述路径添加到环境变量中,重启电脑

【微服务-注册中心】

注册中心的作用: 微服务将业务拆分成了一个一个服务,当实现一个业务的时需要调用多个服务,那么每个服务的调用都需要知道它的URL。如何更方便的调用,注册中心就出现了。 我们可以把注册中心当作通讯录,通讯录中记录了服…

【JS】postMessage与MessageChannel

前言 postMessage 和 MessageChannel 都是用来实现跨文档、跨窗口或跨线程(Web Worker)的消息传递机制。 postMessage 可以在 iframe、同源或跨源窗口之间传递数据,也可以用于主线程与 Web Worker 之间的通信。 postMessage 是一种单向的…

Django 聚合查询

文章目录 一、聚合查询二、使用步骤1.准备工作2.具体使用3.分组查询(annotate)1.定义2.使用3.具体案例 4.F() 查询1.定义2.使用 5.Q() 查询1.定义2.查询 一、聚合查询 使用聚合查询前要先从 django.db.models 引入 Avg、Max、Min、Count、Sum&#xff0…

VS code EXPLORER 中不显示指定文件及文件夹设置(如.pyc, __pycache__, .vscode 文件)

VS code EXPLORER 中不显示指定文件及文件夹设置 引言正文方法1打开方式1打开方式2 方法2 引言 VS code 号称地表最强轻量级编译器,其最大的优势在于用户可以根据自己的需求下载适合自己的 extension。从而定制个性化的编译器。然而,本人今天遇到了一个…

如何调用API接口:一份简明指南

在软件开发中,调用API接口是一项基本而重要的技能。API(应用程序编程接口)允许不同程序之间进行交互,使得数据和功能可以跨应用程序共享。本文将为你提供一份简明的指南,帮助你理解如何调用API接口。 什么是API接口&am…

Android中的引用类型:Weak Reference, Soft Reference, Phantom Reference 和 WeakHashMap

在Android开发中,内存管理是一个非常重要的话题。为了更好地管理内存,Java和Android提供了多种引用类型,包括Weak Reference、Soft Reference、Phantom Reference以及WeakHashMap。这些引用类型在不同的场景下可以帮助我们更有效地管理内存&a…

(笔记)mac笔记本调节键盘速率

我在使用neovim的时候,发现按下hjkl或者shift[]来进行移动的时候 开始延迟大概几百毫秒的时间才开始移动 所以我上网找了下方法 发现修改这了可以改变速率 我就直接拉到了fast 芜湖 起飞 local opt vim.opt local o vim.o local g vim.go.timeoutlen 100 o…

论文速递!时序预测!DCSDNet:双卷积季节性分解网络,应用于天然气消费预测过程

本期推文将介绍一种新的时序预测方法:双卷积季节性分解网络(Dual Convolution withSeasonal Decomposition Network, DCSDNet)在天然气消费预测的应用,这项研究发表于《Applied Energy》期刊。 针对天然气消费的多重季节性和非规律性&#x…

汽车焊机数据通信:Profinet转Canopen网关的神奇连接

在汽车制造领域,汽车焊机的高效、稳定运行对于整车质量至关重要。而Profinet转Canopen网关在汽车焊机的数据通信中发挥着关键作用。 Profinet是一种广泛应用于工业自动化领域的通信协议,具有高速、实时、可靠等特点。Canopen则在汽车电子等领域有着广泛…

软件渗透测试流程有哪些?专业软件测评公司简析渗透测试的好处

软件渗透测试是进行软件安全测评的重要环节,旨在通过模拟攻击手段发现软件系统的脆弱性。这种安全测试方法能够帮助开发人员和系统管理员发现并修复潜在的安全漏洞,以确保软件系统的安全性和完整性。软件渗透测试是一项高度技术性的任务,需要…

口哨声、歌声、boing声和biotwang声:用AI识别鲸鱼叫声

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…