Docker实战

news2025/6/8 7:01:40

目录

一、FROM 语法

二、label语法

三、run语法

四、workdir 语法

五、add 和copy 语法

六、ENV语法

七、volume 和expose 语法

八、run、cmd 和entrypoint


一、FROM 语法

scratch -- 从头开始

尽量来使用官方提供的image

FROM 指定基础镜像,最好挑一些apline,slim之类的基础小镜像. scratch镜像是一个空镜像,常用于多阶段构建 如何确定我需要什么要的基础镜像? Java应用当然是java基础镜像(SpringBoot应用)或者Tomcat基础镜像(War应用) JS模块化应用一般用nodejs基础镜像 其他各种语言用自己的服务器或者基础环境镜像,如python、golang、java、php等

编辑

二、label语法

meta信息,类似于代码的注释。

LABEL multi.label1="value1" multi.label2="value2" other="value3"
LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"

三、run语法

没run一次image上会有新的一层。因此有必要使用&&合并执行,避免layer 过多看起来很混乱。

编辑

四、workdir 语法

使用workdir不要使用run cd来替代

workdir尽量使用绝对路径。增强dockerfile的可移植性。

编辑

五、add 和copy 语法

  • 区别:add 还具有解压缩的功能,例如add test.tat.gz / 会直接将test.tar.gz解压出来

下面以reids源代码为例进行演示

Dockerfile如下

FROM alpine
ADD ./redis-7.0.8.tar.gz /redis/
RUN ls -l
RUN cd /redis && ls -l

结果

  • workdir 和add的结合

  • 添加远程文件/目录使用curl 或者 wget

编辑

copy文件夹时候的坑

https://www.jianshu.com/p/9b7da9aacd8a

六、ENV语法

定义常量,增加可维护性,和shell中定义变量一个意思。

编辑

七、volume 和expose 语法

八、run、cmd 和entrypoint

编辑

例子:

shell 格式的docker file build的image

[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# more Dockerfile 
FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"

[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# docker build -t ninesun0318/centos-entrypoint-shell .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM centos
 ---> 0d120b6ccaa8
Step 2/3 : ENV name Docker
 ---> Running in 00b2f71e6d9f
Removing intermediate container 00b2f71e6d9f
 ---> 4be9a34323b3
Step 3/3 : ENTRYPOINT echo "hello $name"
 ---> Running in cfc67b613f7a
Removing intermediate container cfc67b613f7a
 ---> 865aaaacd1ee
Successfully built 865aaaacd1ee
Successfully tagged ninesun0318/centos-entrypoint-shell:latest



[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# docker image ls
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
ninesun0318/centos-entrypoint-shell   latest              865aaaacd1ee        17 seconds ago      215MB
centos                                latest              0d120b6ccaa8        2 months ago        215MB
hello-world                           latest              bf756fb1ae65        10 months ago       13.3kB

[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# docker run 865aaaacd1ee
hello Docker

很完美这个dockerfile没有问题。

exec格式的docker file build的image

[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# more Dockerfile 
FROM centos
ENV name Docker
ENTRYPOINT ["/bin/echo", "hello $name"]

[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# docker build -t ninesun0318/centos-entrypoint-exec .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM centos
 ---> 0d120b6ccaa8
Step 2/3 : ENV name Docker
 ---> Using cache
 ---> 4be9a34323b3
Step 3/3 : ENTRYPOINT ["/bin/echo", "hello $name"]
 ---> Running in 61c84954936b
Removing intermediate container 61c84954936b
 ---> 2292313abbf0
Successfully built 2292313abbf0
Successfully tagged ninesun0318/centos-entrypoint-exec:latest
[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# 
[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# 
[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# docker image ls
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
ninesun0318/centos-entrypoint-exec    latest              2292313abbf0        5 seconds ago       215MB
ninesun0318/centos-entrypoint-shell   latest              865aaaacd1ee        8 minutes ago       215MB
centos                                latest              0d120b6ccaa8        2 months ago        215MB
hello-world                           latest              bf756fb1ae65        10 months ago       13.3kB

[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# docker run ninesun0318/centos-entrypoint-exec
hello $name
[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# 

奇怪exec 并没有把name 这个ENV打印出来。为何?

只有shell 中才会执行name才会被解释为变量,exec 就是简单的执行。

如何修改呢?

[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# more Dockerfile 
FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash","-c","echo hello $name"]
[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# 

重新build 然后run


[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# docker build -t ninesun0318/centos-entrypoint-exec-new .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM centos
 ---> 0d120b6ccaa8
Step 2/3 : ENV name Docker
 ---> Using cache
 ---> 4be9a34323b3
Step 3/3 : ENTRYPOINT ["/bin/bash","-c","echo hello $name"]
 ---> Running in 5ee34add9195
Removing intermediate container 5ee34add9195
 ---> cf961663ddc1
Successfully built cf961663ddc1
Successfully tagged ninesun0318/centos-entrypoint-exec-new:latest
[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# docker run ninesun0318/centos-entrypoint-exec-new
hello Docker
[root@iZ2vceej7yes1abpm7yec2Z dockerfile]# more Ddo
more: stat of Ddo failed: No such file or directory

这个问题得到了解决。

cmd推荐写法

Dockerfile 测试

CMD为ENTRYPOINT提供默认参数

FROM alpine
LABEL mantainer=ninesun
CMD ["testvm"]
CMD ["uuuidd"]
ENTRYPOINT ["echo"]
docker build -t demo:test -f Dockerfile3 .

docker run  --rm --name test demo:test
uuuidd
# 指定其他命令 
docker run  --rm --name test demo:test 22222
22222

entrypoint推荐写法

例子说明:entrypoint 一定会被执行,cmd 会被覆盖。

Dockerfile列子

FROM alpine
LABEL mantainer=ninesun
CMD ["testvm"]
CMD ["uuuidd"]
ENTRYPOINT ["echo","hahhahah"]
# docker run指定参数 覆盖cmd,但是entrypoint一定被执行
docker run  --rm --name test demo:test 222
hahhahah 222
# docker run 不覆盖cmd,但是entrypoint一定被执行
docker run  --rm --name test demo:test
hahhahah uuuidd

CMD和ENTRYPOINT两者都可以作为容器的入口

Dockerfile中只能有一条CMD指令。 如果列出多个CMD,则只有最后一个CMD才会生效。

CMD的主要目的是为执行中的容器提供默认值。 这些默认值可以包含可执行文件,也可以省略可

执行文件,在这种情况下,您还必须指定ENTRYPOINT指令。

ARG和ENV的区别

  • ARG 是构建时变量

  • ENV是运行时变量

1、ARG

ARG指令定义了一个变量,用户可以在构建时使用--build-arg = 传递,docker build命令会将其传递给构建器。--build-arg 指定参数会覆盖Dockerfile 中指定的同名参数

如果用户指定了 未在Dockerfile中定义的构建参数 ,则构建会输出 警告 。

ARG只在构建期有效,运行期无效

不建议使用构建时变量来传递诸如github密钥,用户凭据等机密。因为构建时变量值使用docker

history是可见的

ARG变量定义从Dockerfile中定义的行开始生效。

使用ENV指令定义的环境变量始终会覆盖同名的ARG指令。

2、ENV

  • 在构建阶段中所有后续指令的环境中使用,并且在许多情况下也可以内联替换。

  • 引号和反斜杠可用于在值中包含空格。

  • ENV 可以使用key value的写法,但是这种不建议使用了,后续版本可能会删除

ENV MY_MSG hello
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy
#多行写法如下
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
MY_CAT=fluffy
  • docker run --env 可以修改这些值

  • 容器运行时ENV值可以生效

  • ENV在image阶段就会被解析并持久化(docker inspect image查看),参照下面示例

FROM alpine
ENV arg=1111111
ENV runcmd=$arg
RUN echo$runcmd
CMD echo$runcmd  #ENV的固化问题: 改变arg,会不会改变 echo的值,会改变哪些值,如何修改这些值?

测试案例

FROM alpine
ARG arg1=22222
ENV arg2=1111111
ENV runcmd=$arg1
RUN echo$arg1$arg2$runcmd
CMD echo$arg1$arg2$runcmd

实战

java-springboot 镜像

# syntax=docker/dockerfile:1
FROM 10.50.10.185/qms/openjdk:8-jdk-alpine
LABEL maintainer="ninesun@126.com"
WORKDIR /opt/app
COPY target/*.jar ./
#Alpine Linux 下的包管理工具
#RUN apk   add mysql-client
# 设定时区UTC -> CST
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone && touch EDA_ETL-0.0.51-SNAPSHOT.jar
ENV JAVA_OPTS=""
ENV PARAMS=""
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar EDA_ETL-0.0.51-SNAPSHOT.jar $PARAMS" ]

python 程序镜像

FROM submitty/python:3.7
COPY ./redis_key_mig /app
WORKDIR /app
RUN /bin/bash -c 'pwd;ls -l /app'
#RUN  /usr/local/bin/python -m pip install --upgrade pip
RUN pip3 install redis==3.5.3
cmd ["python", "/app/redisMigrate.py"]

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

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

相关文章

Qml学习——控件状态

最近在学习Qml,但对Qml的各种用法都不太熟悉,总是会搞忘,所以写几篇文章对学习过程中的遇到的东西做一个记录。 学习参考视频:https://www.bilibili.com/video/BV1Ay4y1W7xd?p1&vd_source0b527ff208c63f0b1150450fd7023fd8 其…

Apache安全加固配置教程(小白篇)

Apache安全加固配置教程(小白篇) 资源宝分享:www.httple.net 一,Apache服务器的介绍 Apache服务器它是Internet网上应用最为广泛的Web服务器软件之一。Apache服务器源自美国国家超级技术计算应用中心(NCSA)的 Web服务器项目中。目…

SAS应用入门学习笔记3

操作数据集的观测: Eg. 修改变量值等 变量的值取出来,那么我们需要对变量的值进行修改 weight height bmi? Missing 用到条件语if then、赋值语句、表达式 等。 表达式是操作数和操作符的序列。 例如:3 x x1 1、操作数:…

每日学术速递2.9

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV、cs.AI、cs.LG、cs.IR 1.Graph Signal Sampling for Inductive One-Bit Matrix Completion: a Closed-form Solution(ICLR 2023) 标题:归纳单比特矩阵完成的图信号采样&am…

程序员该不该在年后跳槽?3个问句给你答案

过完春节,2023年也迎来了第二个月份,有些程序员虽然还在公司上班,但是私底下跳槽的心蠢蠢欲动,简历说不定都改到第三版了。 在各大社交平台上,经常能看到不少程序员分享自己的跳槽经历,尤其是春节后更是如…

13薪|运营策划[北京市 - 海淀区]-10k-15k

"众推职聘”以交付结果为宗旨的全流程化招聘服务平台!今日招聘信息↓【工作内容】1、根据项目要求,收集相关数据,策划撰写项目运营方案;2、运营合作环节中,监督管理执行;3、参与项目的评估&#xff1b…

WorkTool无障碍服务实现企业微信机器人接口

前言 想要实现一个企业微信机器人,如京东/拼多多福利群、美团瑞幸定时营销群、自助订单查询、智能咨询或社群管理机器人等,首先官方未提供外部群/客户群的机器人API,会话存档也只在一定场景下适用,及时使用会话存档也存在只能收不…

56 门控循环单元(GRU)【动手学深度学习v2】

56 门控循环单元(GRU)【动手学深度学习v2】 深度学习学习笔记 学习视频:https://www.bilibili.com/video/BV1mf4y157N2/?spm_id_fromautoNext&vd_source75dce036dc8244310435eaf03de4e330 门控循环单元GRU GRU和LSTM 实际上效果差不多。…

030_SSS_MaskSketch Unpaired Structure-guided Masked Image Generation

MaskSketch: Unpaired Structure-guided Masked Image Generation 1. Introduction 本文在MaskGIT的基础上进行了改进,提出了MaskSketch用于sketch-to-photo。MaskSketch直接使用预训练好的MaskGIT,不需要进行模型的训练,而且不需要成对的监…

29 - 面向对象的三大特征 - 多态

目录 一、理解多态 1、概念 2、使用场景 3、特点 二、多态案例1 1、需求 2、代码实现 一、理解多态 1、概念 不同的子类对象调用相同的父类方法,产生不同的执行结果2、使用场景 以继承和重写父类方法为前提是调用方法的技巧,不会影响到类的内部设计3、特…

Kubernetes那点事儿——健康检查

K8s应用程序生命周期管理——健康检查前言一、重启策略二、健康检查三、健康监控方式前言 官网:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes 一、重启策略 Always&a…

云原生技术在容器方面的应用

随着近几年云原生生态的不断壮大,众多企业纷纷开展了用云上云的工作,学习和了解云原生及容器技术对于现代工程师是必不可少的,本文主要为大家介绍云原生及其在容器方面的应用。 1.1 什么是云原生 云原生技术有利于各组织在公有云、私有云和…

基于可视化 BI 工具 DataEase 制作第七次人口普查数据分析大屏

一、制作第七次人口普查数据大屏的背景介绍:第七次人口普查刚刚结束,想要制作一个大屏,能够直观的看到人口总数、出生人数、死亡人数等的情况;希望能够直观的看到人口分布的情况、各种比例、年龄结构等有一定的了解;直…

【网络原理篇2】TCP报头详解

在这一篇文章当中,了解到TCP是属于传输层的协议;当数据从应用层向传输层发送的时候,如果使用的是TCP协议,那么就需要把应用层的数据加上TCP报头。初识网络:IP、端口、网络协议、TCP-IP五层模型_革凡成圣211的博客-CSDN…

2023年去培训机构学前端还是Java?

选择专业肯定是优先考虑更有发展前景和钱途的专业。毕竟IT专业的培训费都不低,基本都要一两万左右,咱们花钱总是希望获得最大回报。 那么到底哪个更有发展前景呢? 零基础能学得会吗? 就业薪资如何呢? 前言 不知道大家有…

Python运算符优先级

以下表格列出了从最高到最低优先级的所有运算符&#xff1a;运算符描述**指数 (最高优先级)~ -按位翻转, 一元加号和减号 (最后两个的方法名为 和 -)* / % //乘&#xff0c;除&#xff0c;取模和取整除 -加法减法>> <<右移&#xff0c;左移运算符&位 AND^ |位…

pyqt5:python读取二进制文件(音频PCM文件)显示波形

文章目录1.使用ffmpeg生成PCM文件1.1 用 ffprobe 查看文件信息1.2 用 ffmpeg 命令转换1.3 用ffplay 测试播放PCM文件2.python读取PCM文件显示波形2.1 函数numpy.fromfile2.2 数据类型dtype说明3.源码和PCM文件链接有个项目需要输出10-50Hz的低频信号驱动线圈&#xff0c;考虑使…

canal 使用详解

第1章 Canal 简介canal [kənl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费工作原理canal 模拟 MySQL slave 的交互协议&#xff0c;伪装自己为 MySQL slave &#xff0c;向 MySQL master 发送 d…

[架构之路-104]:《软件架构设计:程序员向架构师转型必备》-14-根据需求用例驱动进行软件架构的模块划分过程

14 用例驱动的模块划分过程描述用例的两种方式&#xff1a;图形描述&#xff1a;用例序列图&#xff0c;直观&#xff0c;但修改不方便&#xff0c;版本控制不方便。文本描述&#xff1a;用例规约描述&#xff0c;不直观&#xff0c;但修改方便&#xff0c;版本控制方便。14.1 …

轻松使用 Python 检测和识别车牌(附代码)

车牌检测与识别技术用途广泛&#xff0c;可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计算机视觉和人工智能。 本文将使用Python创建一个车牌检测和识别程序。该程序对输入图像进行处理&#xff0c;检测和识别车牌&#xff0c;最后显示车牌字符&#xff0c;作为…