当前位置: 首页 > news >正文

Dockerfile详解

文章目录

    • 一、Dockerfile介绍
    • 二、常用指令
    • 三、Dockerfile示例
    • 四、最佳实践

一、Dockerfile介绍

Dockerfile是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据Dockerfile的内容构建镜像。
一般的,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,其中,‘#’为Dockerfile中的注释。

二、常用指令

  1. FROM

所有Dockerfile都必须以FROM命令开始。FROM命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像。FROM命令可以多次使用,表示创建多个镜像。

FROM <image>:<tag>
如果本地没有指定的镜像,则会从对应的镜像仓库pull镜像下来,不指定具体镜像仓库,则会从docker hub公共仓库拉取。

如果没有指定标签tag,则默认使用latest标签。

  1. MAINTAINER

设置该镜像的作者。

MAINTAINER <author name>
  1. ENV

设置环境变量,使用键值对,并且该环境变量可以被后续的Dockerfile命令使用

ENV <key>:<value> #设置一个变量
ENV <key1>:<value1> \ #设置多个变量,可以通过"\"换行<key2>:<value2>
  1. ARG

设置构建环境的环境变量,只在构建容器时生效,在将来容器运行时是不会存在这些环境变量的且在构建时可以使用--build-arg=来指定参数。具体用法如下:

ARG <key>=<value>
不要因此就是用ARG保存密码之类的信息,因为docker history可以看到所有的值。
  1. WORKDIR

设置后续Dockerfile命令,像RUN、CMD、ENTRYPOINT、COPY、ADD的工作目录,如果WORKDIR不存在,会自动创建。

WORKDIR /path/workdir
  1. ADD

复制本地主机文件、目录或者远程文件URLS添加到容器指定路径中,它又两个参数和。source是本地绝对路径或者是Dockerfile所在的相对路径,destination是容器内的路径且如果dest路径不存在,会自动创建对应的目录;如果dest路径不是以斜线结尾,文件会以普通文件形式写入到目标。
如果复制的是压缩文件,会自动解压。

ADD <src> <destination>
  1. COPY

COPY复制文件或者目录,并且添加到容器指定路径中。用法同ADD,不同的是不能指定远程文件URL、不会解压压缩包。

COPY <src> <destination>
  1. EXPOSE

设置容器暴露的端口。

EXPOSE <port> 运行容器时,需要配合使用-p或-P参数进行端口映射,映射到宿主机
  1. USER

设置RUN/CMD/ENTRYPOINT的用户名或UID。

USER <name>
  1. VOLUME

设置容器的挂载点。

VOLUME ["/data/]
VOLUME /data1 /data2
  1. RUN

在构建镜像时执行命令。RUN指令会在新创建的镜像上添加新的镜像层。

RUN <command> # shell风格,即shell命令
RUN ["exec","parm1","parm2"] # exec风格
  1. CMD

设置容器启动命令。

CMD ["exec","parm1","parm2"]
CMD ["parm1","parm2"] # 为ENTRYPOINT提供参数列表
CMD <command>
  1. ENTRYPOINT

设置容器的入口程序。具体用法如下:

ENTRYPOINT ["exec","parm1","parm2"]
ENTRYPOINT command parm1 parm2  
ENTRYPOINT与CMD的区别在于,ENTRYPOINT的等级更高,一个Dockerfile里边可以既有ENTRYPOINT又有CMD,这个时候CMD后面的命令会作为ENTRYPOINT的参数传递。

推荐ENTRYPOINT和CMD都使用exec的方式来构建。
如果Dockerfile中指定了多条CMD,只有最后一条会被执行;
每个Dockerfile只能有一个ENTRYPOINT,当多个ENTRYPOINT时,只有最后一个生效。

三、Dockerfile示例

基于CentOS7.9,安装并运行redis

  1. 同级目录文件
$ tree
.
├── CentOS-Base.repo #YUM源,可自行下载阿里云镜像源
├── Dockerfile
├── epel.repo #YUM源,可自行下载阿里云镜像源
├── redis-6.2.12.tar.gz #redis安装包
└── redis.conf #redis配置文件
  1. redis配置文件,使用默认即可
$ vim redis. confbind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/usr/local/redis/log/redis.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/local/redis/data
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass 123456
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
  1. Dockerfile
$ vim DockerfileFROM centos:centos7.9.2009
MAINTAINER real
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone \rm -f /etc/yum.repos.d/*
COPY CentOS-Base.repo epel.repo /etc/yum.repos.d/
RUN yum clean all && yum makecache && yum install -y gcc make
ADD redis-6.2.12.tar.gz /tmp/
RUN cd /tmp/redis-6.2.12 && make MALLOC=libc && make PREFIX=/usr/local/redis install && \mkdir -p /usr/local/redis/{data,etc,log}
COPY redis.conf /usr/local/redis/etc/
ENTRYPOINT exec /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
EXPOSE 6379
  1. 构建镜像
注意命令最后的点`.`,是基于当前目录的Dockerfile进行构建
$ docker build -t redis:latest .
  1. 基于redis镜像启动容器
$ docker run -d --name redis-server -p 16379:6379 redis-d:后台运行容器
--name:为容器指定一个名称
-p:指定端口映射。格式为:宿主机端口:容器端口
最后跟镜像名称
  1. 查看容器
$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                         NAMES
e25d95579784   redis     "/bin/sh -c 'exec /u…"   6 seconds ago   Up 5 seconds   0.0.0.0:16379->6379/tcp, :::16379->6379/tcp   redis-server
  1. 使用redis客户端登录redis容器,进行验证
$ redis-cli -h 127.0.0.1 -p 16379
127.0.0.1:16379> auth 123456
OK
127.0.0.1:16379> 

四、最佳实践

  • 减少镜像层数,尽量把一些指令合在一起;
  • 注意清理镜像构建的中间产物,比如一些安装包在安装之后就把它删掉
  • 注意优化网络请求,使用yum源时,用一些网络比较好的源站点,可节约时间,减少失败率
  • 尽量去构建缓存,把一些不变的东西或者变动较少的东西放在前面,因为不变的东西可以被缓存,如果不想使用缓存,则可以在docker build时添加–no-cache=true选项

相关文章:

Dockerfile详解

文章目录 一、Dockerfile介绍二、常用指令三、Dockerfile示例四、最佳实践 一、Dockerfile介绍 Dockerfile是一个包含创建镜像所有命令的文本文件&#xff0c;通过docker build命令可以根据Dockerfile的内容构建镜像。 一般的&#xff0c;Dockerfile分为四部分&#xff1a;基础…...

零基础小白如何自学sql?

学习SQL对于数据分析和处理来说非常重要。SQL是一种强大的工具&#xff0c;可以帮助你与数据库沟通&#xff0c;提取&#xff0c;整理和理解数据。 以下是一些学习SQL的建议&#xff1a; 01 前期&#xff1a;SQL数据库学习 了解SQL的基本概念&#xff1a;首先&#xff0c;你…...

【刷题笔记2】

刷题笔记2 最小公倍数、最大公约数 两个数的最大公约数两数乘积/最小公倍数 #<include> cmath; int a,b; int mgcd(a,b);//求最大公约数复制字符串substr()函数 s.substr(pos, len) &#xff1a;pos的默认值是0&#xff0c;len的默认值是s.size() - pos string a1;in…...

Kafka之集群搭建

1. 为什么要使用kafka集群 单机服务下&#xff0c;Kafka已经具备了非常高的性能。TPS能够达到百万级别。但是&#xff0c;在实际工作中使用时&#xff0c;单机搭建的Kafka会有很大的局限性。 ​ 消息太多&#xff0c;需要分开保存。Kafka是面向海量消息设计的&#xff0c;一个T…...

Linux备忘手册

常⽤命令 作⽤ shutdown -h now 即刻关机 shutdown -h 10 10分钟后关机 shutdown -h 11:00 11&#xff1a;00关机 shutdown -h 10 预定时间关机&#xff08;10分钟后&#xff09; shutdown -c 取消指定时间关机 shutdown -r now 重启 shutdown -r 10 10分钟之后重启 shutdown -…...

Qt中QGraphicsView总体架构学习

前沿 前段时间学习了下如何在QGraphicsView架构中绘制刻度尺&#xff0c;主要是与OnPainter中进行比较的&#xff0c;那么今天就来详细讲解下我对QGraphicsView框架的认知吧~ 最近一段时间想学习下&#xff0c;如果我有不正确的&#xff0c;欢迎留言探讨哟~ QGraphicsView架…...

STL-list的使用简介

目录 ​编辑 一、list的底层实现是带头双向循环链表 二、list的使用 1、4种构造函数&#xff08;与vector类似&#xff09;​编辑 2、迭代器iterator 3、容量&#xff08;capicity&#xff09;操作 4、element access 元素获取 5、增删查改 list modifiers 6、list的迭…...

MySQL:索引失效场景总结

1 执行计划查索引 通过执行计划命令可以查看查询语句使用了什么索引。 EXPLAIN SELECT * FROM ods_finebi_area WHERE areaName = 福建 执行查询计划后,key列的值就是被使用的索引的名称,若key列没有值表示查询未使用索引。 2 在什么列上创建索引 (1)列经常被用于where…...

LNMP平台对接redis服务

目录 1、安装 LNMP 各个组件 2、安装 redis 服务 3、安装 redis 扩展 4、修改 php 配置文件 5、测试连接 1、安装 LNMP 各个组件 2、安装 redis 服务 3、安装 redis 扩展 官网&#xff1a;http://redis.io/ 下载包&#xff1a; https://codeload.github.com/phpredis/p…...

5G之味,在烟火长沙

今年夏天&#xff0c;有一部电影叫做《长沙夜生活》。影片讲述了长沙大排档中的一些故事。网红大排档的老板娘、厨师、顾客&#xff0c;他们的邂逅、热爱、留下、离开、和解、团圆&#xff0c;都发生在一段夜色里&#xff0c;发生在充满烟火气的长沙城。 有没有想过这样一个问题…...

【MYSQL】MYSQL 的学习教程(十一)之 MySQL 不同隔离级别,都使用了哪些锁

聊聊不同隔离级别下&#xff0c;都会使用哪些锁&#xff1f; 1. MySQL 锁机制 对于 MySQL 来说&#xff0c;如果只支持串行访问的话&#xff0c;那么其效率会非常低。因此&#xff0c;为了提高数据库的运行效率&#xff0c;MySQL 需要支持并发访问。而在并发访问的情况下&…...

LORA的基本原理

本文将介绍如下内容&#xff1a; 什么是Lora高效微调的基本原理LORA的实现方式LORA为何有效&#xff1f; 一、什么是LoRA LoRA 通常是指低秩分解&#xff08;Low-Rank Decomposition&#xff09;算法&#xff0c;是一种低资源微调大模型方法&#xff0c;论文如下: LoRA: Low…...

Vue2x的自定义指令和render函数使用自定义指令

在某些情况下&#xff0c;我们需要对底层DOM进行操作&#xff0c;而内置的指令不能满足需求&#xff0c;就需要自定义指令。一个自定义指令由一个包含类似组件的生命周期的钩子的对象来定义&#xff0c;钩子函数会接收到指令所绑定的元素作为参数。 定义指令 常用两种方式进行…...

Linux学习(2):文件目录指令

Linux学习&#xff08;2&#xff09;&#xff1a;文件目录指令 1 文件目录指令1.1 pwd 用来显示当前目录的绝对路径的1.2 ls 显示当前目录的信息1.3 cd 切换到指定目录1.4 mkdir 创建目录1.5 rmdir 删除空目录1.6 touch 创建空文件1.7 cp 拷贝文件到指定目录1.8 rm 移除文件或目…...

Dockerfile的ENV

文章目录 环境总结测试测试1测试2测试3测试4测试5测试6 参考 环境 RHEL 9.3Docker Community 24.0.7 总结 如果懒得看测试的详细信息&#xff0c;可以直接看结果&#xff1a; 一条 ENV 指令可以定义多个环境变量。Dockerfile里可以包含多条 ENV 指令。环境变量的值不需要用…...

【普中开发板】基于51单片机的简易密码锁设计( proteus仿真+程序+设计报告+讲解视频)

基于51单片机的简易密码锁设计 1.主要功能&#xff1a;资料下载链接&#xff1a; 实物图&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单 【普中】基于51单片机的简易密码锁设计 ( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus8.16(有低版本) 程…...

c语言之输出函数用法 putchar

putchar函数 putchar函数是c语言输出函数&#xff0c;但它只能输出单个字符&#xff0c;如果要输出字符串就不合适了。 应用举例 #include<stdio.h> int main() {putchar(a);putchar(4);putchar(\n);return 0: } 从上面代码可以看出&#xff0c;单字符必须用单引号’…...

高精度原边控制电路D3820,CC/CV精度±5%以内,可作为10W以下小功率、低待机功耗的电源替代,可兼容OB2520

高精度原边控制离线式PWM功率开关 特点 1、全电压范围CC/CV精度保持在5%以内 2、用原边控制&#xff0c;无需TL431和光耦 3、欠压锁定&#xff08;UVLO&#xff09;及自动重启 4、驱动BJT 5、内置前沿消隐&#xff08;LEB&#xff09; 6、逐周期限流模式 7、输出线压降…...

Python库学习(十四):ORM框架-SQLAlchemy

1.介绍 SQLAlchemy 是一个用于 Python 的 SQL 工具和对象关系映射&#xff08;ORM&#xff09;库。它允许开发者通过 Python 代码而不是 SQL查询语言来操作数据库。SQLAlchemy 提供了一种灵活且强大的方式来与关系型数据库交互&#xff0c;支持多种数据库后端&#xff0c;如 P…...

信息学奥赛一本通1014:与圆相关的计算

1014&#xff1a;与圆相关的计算 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 167892 通过数: 85008 【题目描述】 给出圆的半径&#xff0c;求圆的直径、周长和面积。输入圆的半径实数r&#xff0c;输出圆的直径、周长、面积&#xff0c;每个数保留小数点后4…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...