✏️
kingkong
  • Introduction
  • Go
    • 入门
    • 并发
    • 避坑
    • 测试
    • GC
    • 性能剖析PProf
    • 第三方库
    • 学习资料
    • 编写可维护Go语言代码建议
    • SOLID Go Design
    • 数组与切片
    • Go Mudules
    • mac 系统go升级 1.12到1.14
  • Kubernetes
    • 安装
    • 本质
    • 常用命令
    • 架构
    • 配置文件
    • Pod
    • Kubectl
    • 学习资料
  • Mac
    • Mac
    • Alfred4
    • 开机启动项管理
    • 升级macOS Big Sur11.1后蓝牙不能用
    • macOs磁盘清理之Homebrew数据清理
  • Docker
    • 常用命令
    • Dockerfile
    • Compose
    • Registry
    • Limit
    • Network
    • Volume
    • 特殊的进程
    • Namespace-Process
    • Namespace-Mount
    • Namespace-UTS
    • Namespace-IPC
    • Namespace-Network
    • Namespace-User
    • 踩坑
  • DevOps
    • ChatOps
    • GitOps
    • SecOps
    • VictorOps
  • Algorithm
    • raft
  • 中间件
    • etcd
    • Nacos集群部署
    • zookeeper
  • 分布式
    • CAP理论
    • BASE理论
    • Gossip协议
  • 网络
    • IP地址编址方式
    • C10k
    • NIO-BIO-AIO
    • Http
  • Linux
    • 常用命令
    • 常用命令1
    • 常用网络命令
    • 进程管理
    • 守护进程
    • Systemd
    • Unix哲学
    • 端口
    • 网络
    • CentOS目录结构
    • IT
    • 文件系统
    • 开源协定
    • 基础知识
    • bash
    • shell
    • vim
    • lvm2
    • btrfs文件系统
    • raid
    • 任务计划及周期性任务执行
    • find
    • 程序包的安装卸载
    • yum
    • sed
    • 用户、组和权限
  • 数据库
    • Redis
    • MySQL
  • 消息队列
    • kafka
  • 语言之道
  • 程序设计原则
  • LoadBalancer
    • LVS
    • HAProxy
  • 敏捷
    • 影响地图
    • 卡诺模型
    • 精益画布
    • 电梯演讲
    • INVEST原则
    • 复杂系统
    • AARRR模型
    • 用户故事
    • 看板
    • Scrum
  • MicroService
    • 分布式链接追踪系统
    • ServiceMesh
    • 如何设计微服务
    • 领域驱动设计
  • 项目实战
    • 多通道告警服务
    • IAM
  • 管理
    • 沟通
    • 演讲
    • 面试官
  • Authorization
    • JWT
  • Spring
    • IoC
    • SpringFramework
    • Spring核心编程思想
  • Java
    • SPI机制
    • Jar
    • tutorial
    • 面向对象
    • 核心类
    • 泛型
    • 集合
    • IO
    • 日期与时间
    • 单元测试
    • maven
    • 函数式编程
  • Mix
    • Bookmark
    • WorkStation
    • 快速压力转换
    • 手机拍照
    • markdown画图
    • RESTful API设计
    • 如何做单元测试
    • 赶走脂肪肝
  • Aphorism
  • 互联网
    • DNS
    • Nginx
  • Rust
  • Quarkus
    • java.util.zip.ZipException: zip END header not found
  • Python
    • tutorial
  • 区块链
    • Substrate
    • BTC
Powered by GitBook
On this page
  • Format
  • File
  • instruct
  • FROM 命令
  • MAINTAINER
  • LABEL
  • ADD
  • COPY
  • ENTRYPOINT
  • RUN
  • CMD
  • WORKDIR
  • EXPOSE
  • ENV
  • VOLUME
  • USER
  • ONBUILD
  • HEALTHCHECK
  • SHELL
  • STOPSIGNAL
  • ARG

Was this helpful?

  1. Docker

Dockerfile

Format

  • comment 注释

  • INSTRUCTION arguments 指令+参数 指令区分参数建议大写

  • 指令按顺序执行

  • 第一个指令必须是 FROM 构建时要指定的基础镜像

File

  • 专用目录,不用使用当前目录外的文件,子目录下的可以

  • Dockerfile文件名首字母大写

  • .dockeringore 忽略打包文件

instruct

FROM 命令

From <image>:<tag>

用于设置基础镜像 , 一般是Dockerfile的第一句

MAINTAINER

MAINTAINER <name>

镜像作者 用来指定维护者的姓名和联系方式

MAINTAINER "auther auther@mail.com"

LABEL

为镜像指定元数据

LABEEL key=value key=value

ADD

ADD <src> <dest>

将文件复制到文件:是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url, 是容器中的绝对路径

准则

  • 同COPY命令

  • 如果src为url且dest不以/结尾,则src指定的文件将被下载并直接被创建为dest;如果dest以/结尾,则文件名URL指定的文件将被直接下载并保存为dest/filename

  • 如果src是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于“tar -x”命令;然而通过url获取到的tar文件将不会自动展开

  • 如果src有多个,或其间接或直接使用了通配符,则dest必须是以/结尾的目录路径; 如果dest不以/结尾,则其被视作一个普通文件,src的内容将被直接写入到dest

COPY

把宿主机的文件复制到创建的新镜像的文件

COPY <src> <desc> #或
COPY ["<src>",... "<dest>" ] # 路径中有空白字符时使用

复制本地主机的(为Dockerfile所在目录的相对路径)到容器中的,与ADD指令差不多

准则

  • src必须是build上下文的路径,不能是其父目录中的文件

  • src若是目录,则其内部文件或子目录会被递归复制,但src目录自身不会被复制

  • 若是指定了多个src,或src中使用了通配符,则desc必须是一个目录,且必须以/结尾

  • 如果desc事先不存在,它将会被自动创建,这包括其父目录路径

ENTRYPOINT

#推荐使用的exec形式
ENTRYPOINT ["executable", "param1", "param2"] 
#shell形式
ENTRYPOINT command param1 param2

一个Dockerfile中只能有一个ENTRYPOINT,如果有多个,则最后一个生效

RUN

用于指定docker build过程中运行的程序,其中可以是任何命令 每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。

RUN <command> 或者
RUN ["executable", "param1", "param2"]

第一种格式中,command通常为一个shell命令,且以“/bin/sh -c”来运行它,这意味着此进程在容器中的PID不为1,不能接受Unix信号,因此,当使docker stop container命令停止容器时,此进程接收不到SIGTERM信号; 第二种语法格式中的参数是一个JSON格式的数组,其中executable为要运行的命令,后面的为参数,然而此格式指定的命令不会以“/bin/sh -c"来发起,因此常见的shell操作如变量替换及通配符替换将不会进行;不过,如果要运行的依赖shell特性的话,可以将其替换为类似下面的格式

JSON数组中要使用双引号

RUN ["/bin/bash", "-c" "executable", "param1", "param2"]

RUM COMMAND 1 && COMMAND 2 && COMMAND 3

CMD

#使用exec执行,推荐方式
CMD ["executable", "param1", "param2"] 
#在bin.sh中执行,提供给需要交互的应用
CMD command param1 param2 
#提供给ENTRYPOINT的默认参数
CMD ["param1", "param2"]

指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。 如果用户启动容器时候指定了运行的命令,则会覆盖掉CMD指定的命令

WORKDIR

WORKDIR /path/to/workdir

为后续的RUN,CMD,ENTRYPOINT指令配置工作目录。 可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前的命令指定的路径。例如:

WORDKIR /a
WORDKIR b
WORDKIR c
RUN pwd

则最终路径为/a/b/c。

EXPOSE

EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]

告诉Docker服务端暴露的端口号,供互联系统使用。 例如

#开放端口8080 和80
EXPOSE 8080/tcp 80/udp
docker run -P //暴露端口

ENV

指定一个环境变理,会被后续的RUN指令合用,并在容器运行时保持。 format: $variable_name 或 ${variable_name}

ENV <key> <value> 或
ENV <key>=<value>...

第一种格式key之后的所有内容均被视为value的组成部分,因此一次只能设置一个变量; 第二种格式可用一次设置多个变理,每个变理为一个key=value的键值对,如果value中含有空格可用反斜线(\)进行转义,也可通过对value加引号进行标识;另外反斜线也用于续行; 定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能

VOLUME

VOLUME ["/data"]

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

USER

USER <UID/Username>

为容器内指定CMD RUN ENTRYPOINT命令运行时的用户名或UID。

ONBUILD

ONBUILD [INSTRUCTION]

配置当所创建的镜像作为其它新创建的镜像的基础镜像时,所执行的操作指令。 例如,利用Dockerfile创建一个镜像A,其中Dockerfile中有这么几个命令

ONBUILD RUN mkdir test
ONBUILD ADD app.js /test/app.js

那么镜像B基于镜像A去构建的时候,默认会在最后加上这两行命令

 FROM 镜像A
 RUN mkdir test
 ADD app.js /test/app.js

HEALTHCHECK

检查主进程的工作状态健康与否

--interval --timeout --start-period 等待时间 --retries 检查次数

状态

  • 0 success

  • 1 unhealth

  • 2 reserved

SHELL

运行程序,默认运行的shell程序

STOPSIGNAL

设置退出信号

ARG

只在build中使用,在执行build时,进行传参

Previous常用命令NextCompose

Last updated 4 years ago

Was this helpful?

example: HEALTHCHECK --interval==5m --timeout=3s CMD curl -f || exit 1

http://localhost/