Dockerfile introduce

简介:
使用Dockerfile创建image, 比使用container直接打包更灵活.
本文将介绍一下Dockerfile的用法, 使用Dockerfile建立image, 需要了解4部分的内容.
在docker库也可以找到很多Dockerfile的示例.
使用docker inspect则可以查看image或container的内容, 里面有很多信息可以和制作image用到的Dockerfile对应.

1. 上下文目录
首先要创建 上下文目录, 用于存放Dockerfile, .dockerignore, 以及要传到image中的文件.

2. 文件
在上下文目录中, 包含几类文件 Dockerfile,  .dockerignore, 以及要传到image中的文件.
2.1 Dockerfile即用来制作image的一些指令集合.
2.2 .dockerignore即用来忽略上下文目录中包含的一些image用不到的文件, 在.dockerignore中的文件或目录, 在制作image时, 不会传送到docker server.
2.3 要传输到docker server的文件和目录都放在上下文目录中, (例如使用ADD, COPY时, 源文件必须在上下文目录中)

3. Dockerfile 的语法
# Comment
INSTRUCTION arguments
注意第一条指令必须是FROM. 即基础镜像是哪个.

4. Dockerfile 指令集介绍
在Dockerfile文件中, 指令不区分大小写, 但是为了易读, 建议统一使用大写指令.
4.1 FROM
FROM <image>
Or
FROM <image>:<tag>
解释, 指定一个基础镜像, 用以制作本镜像. 如果image有多个tag, 但是未指定tag的话, 默认使用latest. (即最新的镜像)
例如, 
FROM centos:centos6

4.2 MAINTAINER
MAINTAINER <name>
解释, 可用于告知该image的制作作者是谁.
例如, 
MAINTAINER digoal@126.com

4.3 RUN
RUN has 2 forms:
RUN <command> (the command is run in a shell - /bin/sh -c - shell form)
RUN ["executable", "param1", "param2"] (exec form)
解释, 在building过程中执行的命令, 可以写多条, 有两个格式, 分别表示在shell环境中执行, 或者直接执行.
例如, 
RUN yum install -y postgresql
RUN ["/bin/bash", "-c", "yum install -y postgresql"]
注意, 当环境中没有shell环境时, 使用第一种格式会有问题, 必须使用第二种格式, 或者没有/bin/sh但是有其他shell环境的话, 也必须使用第二种格式.
环境变量只有在shell 中被替换, 所以必须使用shell格式或在exec格式中使用shell, 例如 : 
RUN [ "sh", "-c", "echo", "$HOME" ]
RUN echo $HOME

4.4 CMD
The CMD instruction has three forms:
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
解释, CMD在Dockerfile中只需要使用一次, 如果写了多条, 那么只有最后一条生效. CMD不是在building时被调用的, 而是在docker run时自动调用的command, 并且会被docker run后面写的command覆盖. 可参考 : 
CMD还可以和ENTRYPOINT结合使用, 当做ENTRYPOINT的传入参数.
例如, 
FROM ubuntu
CMD echo "This is a test." | wc -

CMD ["/usr/bin/wc","--help"]

4.5 EXPOSE
EXPOSE <port> [<port>...]
解释, 用于container inter connection, 参考 http://blog.163.com/digoal@126/blog/static/163877040201492710339762/
指该image启动后的监听端口, 和-p或-P的功能不一样, EXPOSE仅仅用于container之间内部连接, 即自动创建端口对应的环境变量. 如果要将端口映射到宿主机还是需要使用-p或-P的.

4.6 ENV
ENV <key> <value>
解释, 用于设置环境变量, 我们可以使用docker inspect查看当前image设置的环境变量, 同时可以在运行时覆盖已经设置的环境变量, docker run --env <key>=<value>

4.7 ADD
ADD <src>... <dest>
解释, 用于将上下文目录中的文件或目录拷贝到image中, 同时还可以直接从URL下载文件并拷贝到image中, 注意, 如果文件是压缩文件的话(identity, gzip, bzip2 or xz), 会自动解压. 如果你不希望自动解压, 那么请使用COPY , 而不要使用ADD.
支持通配符.
例如, 
ADD hom* /mydir/        # adds all files starting with "hom"
ADD hom?.txt /mydir/    # ? is replaced with any single character

4.8 COPY
COPY <src>... <dest>
解释, 与ADD略有不同(不解压, 不支持URL), 参考 : 
例如, 

4.9 ENTRYPOINT
ENTRYPOINT has two forms:
ENTRYPOINT ["executable", "param1", "param2"] (exec form, the preferred form)
ENTRYPOINT command param1 param2 (shell form)
解释, 在Dockerfile中只需要写一条ENTRYPOINT指令, 多条的话最后一条生效, 和CMD一样, 在run image的时候被调用, 在build image时不会调用. 但是与CMD略有不同, 不会被docker run的COMMAND部分覆盖, 参考 : 
例如, 
COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

4.10 VOLUME
VOLUME ["/data"]
解释, 创建卷, 一般可用于存储数据库数据文件, 配置文件等container特定的文件.
例如, 
VOLUME ["/data"]

4.11 USER
USER daemon
解释, 设置后续的RUN指令执行的用户.
例如, 
RUN useradd postgres
USER postgres
RUN pg_ctl start

4.12 WORKDIR
WORKDIR /path/to/workdir
解释, 改变当前的工作目录, 因为RUN并不会改变工作目录, 所以要改变工作目录时, 可以使用 WORKDIR或者使用一行指令.
例如, 
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
或者
RUN cd /a/b/c && pwd
返回/a/b/c

但是
RUN cd /a/b/c
RUN pwd 
无法得到/a/b/c

4.13 ONBUILD
ONBUILD [INSTRUCTION]
解释, ONBUILD中的指令不会被触发, 而是在其他image使用该image时, 自动在FROM后面加上这些 ONBUILD后的指令, 如果这些指令执行失败的话, 以该image创建其他image的操作也会失败.
ONBUILD不会被继承, 即其他image使用该image创建的话, 不会继承该image的ONBUILD指令.
例如, 
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
使用该image创建其他image时, 会自动在FROM后加上
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

[参考]
目录
相关文章
|
SpringCloudAlibaba 网络协议 Cloud Native
Spring Cloud Alibaba-全面详解(学习总结---从入门到深化)
Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。
16032 3
Spring Cloud Alibaba-全面详解(学习总结---从入门到深化)
PS - 批量处理(以批量修改图片像素为例)
PS - 批量处理(以批量修改图片像素为例)
4474 0
PS - 批量处理(以批量修改图片像素为例)
|
数据可视化 应用服务中间件 数据安全/隐私保护
轻量应用服务器部署k3s,并搭建可视化高性能网关 apisix
k3s低资源占用集群,apisix 可视化高性能网关。小白教程
2313 0
|
人工智能 自然语言处理 搜索推荐
全面升级!揭秘阿里云智能Logo设计的AI黑科技
免费体验!阿里云智能logo设计一直致力于用AI技术,帮助更多有设计需求的朋友能“多快好省”地做logo,让“设计logo”这件有门槛的事情,通过智能工具能轻松打造。满意再付款,首单仅需9.9元。
3808 0
全面升级!揭秘阿里云智能Logo设计的AI黑科技
|
11月前
|
人工智能 供应链 搜索推荐
中国CRM市场深度分析:主流供应商排名与特点解析
随着中国企业数字化转型的深入,CRM(客户关系管理)软件市场迅速发展,形成了多个优秀解决方案提供商。销售易、纷享销客、明源云客、金蝶云之家、简道云、红圈营销和爱客CRM等供应商各具特色。销售易在大型企业市场表现突出,提供全链路营销销售一体化及强大的AI能力;纷享销客以易用性和高性价比著称,适合中小企业;明源云客专注房地产行业,提供全流程解决方案;金蝶云之家与ERP系统深度整合,适合传统制造业;简道云是低代码平台,灵活性高;红圈营销专注零售业,支持全渠道营销;爱客CRM则主打智能营销功能。企业在选择CRM时需综合考虑实施难度、价格定位、技术支持等因素,并结合自身需求进行试用和调研,确保选择最适合
|
机器人 Android开发 开发者
视频号不入镜自动开播的机器人真的来啦
视频号不入镜自动开播的机器人真的来啦
410 2
【NI Multisim 14.0原理图的设计——原理图分类】
一、原理图的设计 根据电路设计的具体要求,可以着手将各个元器件连接起来,以建立并实现电路的实际连通性。这里所说的连接,指的是具有电气意义的连接、即电气连接。 电气连接有两种实现方式,一种是“物理连接”,即直接使用导线将各个元器件连接起来;另一种是“逻辑连接”,即不需要实际的连线操作,而是通过设置网络标号使元器件之间具有电气连接关系。 🍊知识点: • 原理图分类 • 简单电路的设计 • 平坦式电路的设计 二、原理图分类 随着电子技术的发展,所要绘制的电路越来越复杂,在一张图纸上就很难完整地绘制出来,即使绘制出来也因为过于复杂,不利于用户的阅读分析与检测,也容易出错,于是衍生出两种电路设计方
553 0
【NI Multisim 14.0原理图的设计——原理图分类】
|
算法 应用服务中间件 网络安全
Nginx配置HTTPS以及HTTPS原理
Nginx配置HTTPS以及HTTPS原理
480 0
Nginx配置HTTPS以及HTTPS原理
|
C语言
C语言数据结构篇——单循环链表的创建,插入,节点删除,打印等操作
C语言数据结构篇——单循环链表的创建,插入,节点删除,打印等操作
560 0
C语言数据结构篇——单循环链表的创建,插入,节点删除,打印等操作
|
Python
ModuleNotFoundError: No module named ‘torch‘解决方案python安装torch(python3.6+torch1.6)
ModuleNotFoundError: No module named ‘torch‘解决方案python安装torch(python3.6+torch1.6)
983 0
ModuleNotFoundError: No module named ‘torch‘解决方案python安装torch(python3.6+torch1.6)

热门文章

最新文章