Dockfile基本语法

2024-04-01 05:18
文章标签 语法 基本 dockfile

本文主要是介绍Dockfile基本语法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

FROM

功能为指定基础镜像,并且必须是第一条指令。 如果不以任何镜像为基础,那么可写为:FROM scratch。
接下来所写的指令将作为镜像的第一层开始。
格式:

FROM <image>
FROM <image>:<tag>
FROM <image>:<digest> 

默认值为latest

MAINTAINER

指定作者
格式:

MAINTAINER <name>

ENV

为容器设定环境变量

ENV <key> <value>  设置一个
ENV <key>=<value>   设置多个

ADD

复制,把文件复制到镜像中(Dockfile所在目录为根目录),类似于scp

ADD <src>... <dest>
ADD ["<src>",... "<dest>"]

路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径
可以是一个本地文件或者是一个本地压缩文件,还可以是一个url
如果把写成一个url,那么ADD就类似于wget命令
写法:

ADD ares t1/ 
ADD ares /t1
ADD http://example.com/ares /

若src是个目录,则会把目录下所有文件复制到容器,不会复制目录

COPY

复制命令

COPY <src>... <dest>
COPY ["<src>",... "<dest>"]

COPY的只能是本地文件,其他用法与ADD一致

VOLUME

挂载功能,将本地目录或者其他容器内得目录挂在到这个容器中,一般挂载数据文件

VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /data

任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化,容器运行时可通过-v覆盖配置

USER

设置启动容器的用户,可以是用户名或UID

USER daemo
USER UID

如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行

WORKDIR

WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在, WORKDIR 会自动建立目录。

WORKDIR <工作目录路径>

EXPOSE

声明端口,暴漏容器运行时的监听端口给外部

EXPOSE <端口1> [<端口2>...]

运行时并不会因为这个声明应用就会开启这个端口的服务.在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

RUN

运行指定的命令

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

第一种后边直接跟shell命令
在linux操作系统上默认 /bin/sh -c
在windows操作系统上默认 cmd /S /C
第二种是类似于函数调用。
RUN书写时的换行符是\,多行命令不要写多个RUN,使用&&连接

CMD

容器启动时要运行的命令

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

只可以使用双引号!

CMD echo $HOME实际会被翻译成CMD [ "sh", "-c", "echo $HOME" ]

Docker 不是虚拟机,容器中的应用都应该以前台执行!

CMD service nginx start命令应该写为CMD ["nginx", "-g", "daemon off;"]

RUN是构件容器时就运行的命令以及提交运行结果;
CMD是容器启动时执行的命令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子;
可写多个,只有最后一个生效

ENTRYPOINT

功能是启动时的默认命令,不可被 docker run 提供的参数覆盖

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数
示例:

CMD ["-f","/var/log/message"]
ENTRYPOINT ["tail"]
会在启动的时候执行tail -f /var/log/message

ARG

构建参数

ARG <参数名>[=<默认值>]

ARG命令定义了一个变量,在docker build创建镜像的时候,使用 –build-arg =来指定参数

ONBUILD

ONBUILD <其它指令>

ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN , COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

STOPSIGNAL

当容器推出时给系统发送什么样的指令

STOPSIGNAL signal

HEALTHCHECK

容器健康状况检查命令,告诉 Docker 应该如何进行判断容器的状态是否正常

HEALTHCHECK [OPTIONS] CMD command :设置检查容器健康状况的命令
HEALTHCHECK NONE :如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

[OPTIONS]的选项支持以下三中选项:
--interval=DURATION 两次检查默认的时间间隔,默认为30秒
--timeout=DURATION 健康检查命令运行超时时长,默认30秒
--retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态unhealthy,默认次数是3
HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效。
CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下:
0: success - 表示容器是健康的
1: unhealthy - 表示容器已经不能工作了
2: reserved - 保留值
示例:

HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1

健康检查命令是:curl -f http://localhost/ || exit 1
两次检查的间隔时间是5秒
命令超时时间为3秒

这篇关于Dockfile基本语法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/866287

相关文章

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联