Docker教程 Dockerfile 标签介绍

docker commit 也可以用来构建镜像,但是并不推荐。相反,更推荐使用dockerfile与docker build命令来构建镜像,Dockerfile使用基本的基于DSL(Domain Specific Language)语法的指令来构建Docker镜像。Dockerfile构建镜像更具备可重复性、透明性以及幂等性。

指令介绍

FROM
MAINTAINER

介绍镜像作者

MAINTAINER Sajor "sajor@foxmail.com"
RUN

每条RUN指令都会创建一个新的镜像层,如果该指令执行成功,就会将此镜像层提交,之后继续执行Dockerfile中的下一条指令。

默认情况下RUN指令会在shell里使用命令包装器 /bin/sh -c 来执行。如果是不支持shell的平台也可以使用exec格式的RUN指令

# 默认
RUN apt-get update && apt-get install -y nginx
# exec格式
RUN ["apt-get", "install", "-y", "nginx"]
CMD

类似RUN,RUN指令是指定镜像被构建时要运行的命令,而CMD是指定容器被启动时要运行的命令。和docker run命令类似,该指令会被docker run命令覆盖,多条CMD指令也只会执行最后一条。

# 和RUN指令一样,推荐用数组方式
CMD ["/bin/bash"]# 会被此命令中的/bin/ps覆盖
docker run -it sajor/test /bin/ps 
ENTRYPOINT

与CMD指令也很类似。因为CMD指令会被docker run命令覆盖,但此命令不会,而且docker run命令中指定的任何参数都会被当作参数再次传递给ENTRYPOINT指令中指定的命令。

ENTRYPOINT ["/usr/sbin/nginx"] 
# 可和ENTRYPOINT命令结合
docker run  -it sajor/test -g "daemon off;"

也可以和CMD命令结合使用

ENTRYPOINT ["/usr/sbin/nginx"] 
CMD ["-h"]
# 可和ENTRYPOINT命令结合,若不指定参数则默认-h,指定则后台启动
docker run  -it sajor/test -g "daemon off;"
WORKDIR

设置工作目录

ENV

设置环境变量

ENV TARGET_DIR /opt/app SOURCE_DIR /opt/soft
WORKDIR $TARGET_DIR

进入容器后,输入env命令,也可查看所有环境变量

USER

指定用户名或UID,以及组或GID,或两者任意组合

USER user
USER user:group 
USER uid:gid
VOLUME

指定数据卷,可以让我们将数据如源代码、数据库或者其他内容添加到镜像中,而不是提交到镜像中。并且允许我们在多个容器间共享这些内容。

  • 卷可以在容器间共享和重用
  • 对卷的修改是立即生效的
  • 对卷的修改不会对更新镜像产生影响
  • 卷会一直存在直到没有任何容器再使用它
# 基于此镜像创建的任何容器创建一个名为 /data 的挂载点
VOLUME ["/data"]
# 多个卷
VOLUME ["/opt/project", "/data"]
ADD

用于将构建环境下的文件和目录复制到镜像中

# 源文件位置和目标文件位置
ADD software.lic /opt/application/software.lic# 源也可以是个URL,或构建上下文或者环境中文件名或目录
ADD http://wordpress.org/latest.zip /root/wordpress.zip# 源为压缩文件,会自动解压,如果已存在同名文件则不覆盖
ADD latest.tar.gz /var/www/wordpress/

如果目标路径不存在,则会自动创建 权限默认为755,且UID与GID都为0。

注意:ADD指令会使构建缓存失效。

COPY

和ADD类似,单不做文件提取(extraction)和解压(decompression)的工作。

不能复制Dockerfile以外的文件。(因为构建环境是上传到docker守护进程中,复制是在docker守护进程中执行,任何位于构建环境以外的东西是不可用的)

# COPY指令的目的位置必须是容器内部的一个绝对路径。
COPY conf.d/ /etc/apache2/
LABEL

用于为Docker镜像添加元数据。元数据以键值对形式展现。

防止不同的元数据指令创建过多镜像层,建议将所有元数据都放入一行。可通过 docker inspect 来查看label信息。

LABEL version="1.0" type="Data Center" role="Web Server"
ARG

ARG指令用于定义 docker build 命令运行时传递的变量。

ARG var
ARG webapp_user=user

和此命令搭配使用 docker build --build-arg var=1234 -t sajor/webapp . var值设置为1234。而webapp_user仍为默认的user。

只有预先在Dockerfile中定义后,才可以使用docker build命令指定,Docker预定义了一组ARG变量,可以在构建时直接使用。而不必再到Dockerfile中定义。 预定义ARG变量

# 预定义ARG变量
HTTP_PROXY
HTTPS_PROXY
FTP_PROXY
NO_PROXY
ALL_PROXY
http_proxy
https_proxy
ftp_proxy
no_proxy
all_proxy

切记不要使用ARG来传递证书或密钥之类的机密数据。在构建过程中或构建历史中会被暴露。

ONBUILD

该指令可为镜像添加触发器,当一个镜像被用作其他镜像的基础镜像时,该镜像中的触发器被执行。

ONBUILD ADD . /app/src
ONBUILD RUN cd /app/src && make 

可通过inspect命令查看。OnBuild。

ONBUILD一般在子镜像的FROM后执行,只会触发子镜像,孙子镜像不会触发。

FROM、MAINTAINER和ONBUILD不能用于ONBUILD

EXPOSE

端口暴露。

EXPOSE 80
STOPSIGNAL

用于设置停止容器时发送什么系统调用信号给容器。必须是内核系统调用表中合法的数,如9.或者SIGNAME格式中的信号名称,如SIGKILL。


构建

  • docker build -t="" git@github.com:xxx/xxx -f /path/to/dockerfile #构建镜像
    • --no-cache 略过缓存功能
    • -f 文件名称可以不是dockerfile,-f可指定Dockerfile路径
    • --build-arg # 给ARG传递参数使用
  • docker history xxxx #查看镜像构建层
    可以直接从Git仓库中

安全测评root权限 Dockerfile Misconfiguration: Default User Privilege

RUN pip install flask && \groupadd -r flask && useradd -r -g flask flask && \mkdir /src && \chown -R flask:flask /srcUSER flaskCOPY app.py /src/app.pyWORKDIR /src

alpine 中命令不一样 How do I add a user when I'm using Alpine as a base image?

# 使用非root账户启动
RUN addgroup -S dispatch && adduser -S dispatch -G dispatch && \mkdir /app && \chown -R dispatch:dispatch /app && \echo "Asia/shanghai" > /etc/timezone \USER dispatchWORKDIR /app

Dockerfile 技巧——尽量使用非root用户

Dockerfile的最佳实践

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

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

相关文章

MobaXterm连接服务器步骤

双击该软件 选择Session 点击SSH 填写服务器的IP地址、服务器的用户名称、Port这个端口号一般都是这个,但有些可能例外,自己注意一下,最后点击OK就行 这个五角星点击一下,就可以看到您自己刚才的配置。 鼠标左键双击&…

第 12 章 多路查找树

文章目录 12.1 二叉树与B 树12.1.1 二叉树的问题分析12.1.2 多叉树12.1.3 B 树的基本介绍 12.2 2-3 树12.2.1 2-3 树是最简单的 B 树结构, 具有如下特点:12.2.2 2-3 树应用案例12.2.3 其它说明 12.3 B 树、B树和 B*树12.3.1 B 树的介绍12.3.2 B 树的介绍12.3.3 B树的介绍12.3.4…

uniapp-x uts 介绍

uts 是什么 uts,全称 uni type script,是一门跨平台的、高性能的、强类型的现代编程语言。 它可以被编译为不同平台的编程语言,如: web平台,编译为JavaScriptAndroid平台,编译为KotliniOS平台&#xff0…

无root权限安装git-lfs(linux版)

首先给大家看一下官方链接:安装 Git Large File Storage - GitHub 文档 git-lfs/INSTALLING.md at main git-lfs/git-lfs (github.com) 直接用这个命令好啦~绕了一大圈 conda install git #yum install git 以下是手动安装 接下来是我的步骤: 首先在…

深入理解 Spark(四)Spark 内存管理模型

Spark 中的内存管理和资源管理模型 Executor 进程作为一个 JVM 进程,其内存管理建立在 JVM 的内存管理之上,整个大致包含两种方式:堆内内存和堆外内存。 一个 Executor 当中的所有 Task 是共享堆内内存的。一个 Work 中的多个 Executor 中的…

如何简单的使用文心一言(高级版)(中国版ChatGPT)

文心一言API高级版使用 一、百度文心一言API(高级版)二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例5、智能生成API代码 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、百度文心一言API(高级版) 基于百度文心一言语言大模型的…

[NAND Flash 5.4] QLC 闪存给SSD主控带来了很大的难题?

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 前言 世界各大主流闪存厂商,如美光、海力士、铠侠和长江存储积极致力于QLC的研发,并相继推出了QLC SSD产品。随着技术的不断进步,人们普遍担心的QLC擦…

Elasticsearch 快速入门指南【总结记录】

本文将介绍一些基本概念&#xff0c;帮助您快速入门使用Elasticsearch。 一、概述 ES用来解决什么问题&#xff1f;Elasticsearch是解决海量数据&#xff08;已经存在的数据&#xff09;全文检索的不二只选。 Elasticsearch是一个基于Java语言开发&#xff0c;建立在开源搜索…

cssip 第11章 : 安全网络架构和保护网络组件

11.1 OSI模型 协议&#xff1a;定义数据如何通过网络介质传输。 11.1.1 OSI模型的历史 开发 OSI 协议是为给所有计算机系统建立通用的通信结构或标准。 OSI模型表示&#xff1a;应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。 11.1.3 封装/解…

What does rpm do?

RPM 是 Red Hat Package Manager 的缩写&#xff0c;顾名思义是Red Hat 贡献出来的软件包管理工具&#xff0c;支持安装、更新、卸载、查询、验证和管理系统软件包。hheg [Ref] linux下的rpm是什么意思 [Ref] 20 个常用的 RPM 命令 RPM 将所有已安装软件包的信息 保存在 /v…

1944. 队列中可以看到的人数

1944. 队列中可以看到的人数 - 力扣&#xff08;LeetCode&#xff09; 1、一个人能看到的人要么比他自己高&#xff0c;要么比他自己矮 2、一个人最多只能看到一个比自己高的人 那可以倒序遍历height 数组&#xff0c;单调栈中降序&#xff0c;a若能弹出b说明b左边第一个比b…

「Vue3面试系列」Vue 3.0中Treeshaking特性有哪些?举例说明一下?

文章目录 一、是什么二、如何做Vue2 项目Vue3 项目 三、作用参考文献 一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除…

k8s的存储卷(数据卷)

1、存储卷&#xff1a;容器内的目录和宿主机的目录进行挂载 2、容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会恢复到初始状态&#xff0c;一旦回到初始状态&#xff0c;所有的后…

SpringBoot从数据库读取数据数据源配置信息,动态切换数据源

准备多个数据库 首先准备多个数据库&#xff0c;主库smiling-datasource&#xff0c;其它库test1、test2、test3 接下来&#xff0c;我们在主库smiling-datasource中&#xff0c;创建表databasesource&#xff0c;用于存储多数据源相关信息。表结构设计如下 创建好表之后&#…

平面光波导_三层均匀平面光波导_射线分析法

平面光波导_三层均匀平面光波导_射线分析法 三层均匀平面光波导&#xff1a; 折射率沿 x x x 方向有变化&#xff0c;沿 y y y、 z z z 方向没有变化三层&#xff1a;芯区( n 1 n_1 n1​) > > > 衬底( n 2 n_2 n2​) ≥ \geq ≥ 包层( n 3 n_3 n3​)包层通常为空…

LLM_InterLM-Demo学习

reference Github: https://github.com/InternLM/tutorial/blob/main/helloworld/hello_world.md 1- 环境配置 之前都是用科学上网在huggingFace进行的模型下载&#xff0c;同时还需要进行一些配置 import os os.environ[CURL_CA_BUNDLE] 在本次的学习中发现可以设置镜像或…

Docker容器进入的4种方式(推荐最后一种)

在使用Docker创建了容器之后&#xff0c;大家比较关心的就是如何进入该容器了&#xff0c;其实进入Docker容器有好几多种方式&#xff0c;这里我们就讲一下常用的几种进入Docker容器的方法。 进入Docker容器比较常见的几种做法如下&#xff1a; 使用docker attach使用SSH使用…

【已解决】C语言实现多线程检索数据

本博文源于笔者正在学习的c语言。学习如何用多线程进行检索数据。这里以检索一个数组的数据为例&#xff0c;给出代码&#xff0c;并分析如何进行线程通信&#xff0c;如果检索到&#xff0c;其余就别检索了。 文章目录 问题来源问题解决方案代码实现效果总结 问题来源 想要用…

这可能是最全面的Java集合面试八股文了

内容摘自我的学习网站&#xff1a;topjavaer.cn 常见的集合有哪些&#xff1f; Java集合类主要由两个接口Collection和Map派生出来的&#xff0c;Collection有三个子接口&#xff1a;List、Set、Queue。 Java集合框架图如下&#xff1a; List代表了有序可重复集合&#xff0c…

【VSCode,Python】一劳永逸的成功导入本地模组,PYTHONPATH的修改,与各种踩坑点

【VSCode&#xff0c;Python】一劳永逸的成功导入本地模组&#xff0c;PYTHONPATH的修改 起因查阅发现做法一 &#xff08;推荐做&#xff09;做法二 &#xff08;推荐必做&#xff09;踩坑点&#xff08;必看&#xff09; 起因 文件目录如下&#xff1a; my_project/ |-- pa…