ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

dockerfile

2020-05-24 23:04:07  阅读:242  来源: 互联网

标签:容器 RUN CMD 命令 ENTRYPOINT 镜像 dockerfile


Docker 并不建议用户通过commit方式构建镜像,原因如下:

1:这是一种手工创建镜像的方式,容易出错,效率低且重复性弱。

2:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序,存在安全隐患。

用Dockerfile构建镜像,底层也docker commit 一层一层构建新镜像的。

1.运行docker build命令,-t  将新镜像命名,末尾的.指名build context为当前目录,从当前目录下寻找Dockerfile,也可以用-f指定Dockerfile的位置。

2.首先Docker将build context中的所有文件发送给Docker daemon。build context为镜像构建提供所需要的文件或目录。Dockerfile中的ADD,COPY等命令可以将build context中的文件添加到镜像。

查看镜像分层结构

docker history会显示镜像的构建历史。

docker history centos-yum:latest

镜像的缓存特性

Docker会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建。

如果我们希望在构建镜像时不使用缓存,可以在docker build命令中加上–no-cache参数。Dockerfile中每一个指令都会创建一个镜像层,上层依赖于下层,只要某一层发生变化,其上面的缓存都会失效。

From

功能为指定基础镜像,并且必须是第一条指令,如果不以任何为镜像,那么写法为:FROM scratch。

FROM <image>
FROM <image>:<tag>
FROM <image>:<digset>

FROM centos7

RUN

为运行指定的命令,有两种格式:(构建是就执行的命令)
1:RUN 后面直接跟shell命令,linux中默认 /bin/sh -c
2:RUN[“executable”,“param1”,“param2”] executable为可执行文件,后面是参数

RUN yum -y install httpd

RUN ["/bin/bash","-c","echo hello"]

一定要注意:多行命令不要写多个run,建议使用换行符

cmd

容器启动时要运行的命令

1.CMD [“executable”,“param1”,“param2”]
2.CMD [“param1”,“param2”]
3.CMD command param1 param2

CMD ["ls,"/tmp"]

注意:必须要用双引号

LABEL

为镜像指定标签

LABEL <key>=<value>…
如果有很多建议写到一行,用换行符 \

LABEL com.example.vendor="caoyi" \

com.example.vendor2="caoyi1"

###:LABEL会继承基础镜像的LABEL,若key相同,则覆盖

MAINTAINER

指定作者

MAINTAINER caoyi

EXPOSE

开放端口,必须在容器启动的时候加上-P参数

EXPOSE 80

ENV

设置环境变量

ENV 变量=参数 (可以一次设置多个)

ENV ip=www.caoyi.com

ADD

复制命令,将文件复制到镜像中。

ADD text.txt /tmp

ADD   http://www.test.com/text.txt               /tmp

                     源地址                                   目标地址

COPY

COPY caoyi.txt /tmp

####:不支持url,并且如果复制的是一个包文件,会将其自动解包

ENTRYPOINT

(1)启动时的默认命令

ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command param1 param2

ENTRYPOINT ["ls","/tmp"]

(2)也可以不加文件或目录

ENTRYPOINT ["ls"]

在容器启动时后面加上可执行文件

docker run -it centos:latest /tmp

与CMD一起使用时:可以查看CMD指定的文件或目录

CMD ["/etc","/"]

ENTRYPOINT ["ls"]

####:如果我们同时写了CMD与ENTRYPOINT,并且都是完整指令,那么会覆盖,谁在后面谁生效

USER

设置启动容器的用户

USER daemo
USER UID

USER caoyi

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

WORKDIR

设置工作目录

WORKDIR /caoyi

对RUN,ENTRYPOINT,COPY,ADD生效。
如果不存在则会创建,也可以设置多次

WORKDIR /caoyi1

WORKDIR /caoyi2

WORKDIR /caoyi3

RUN pwd

执行结果是

/caoyi1/caoyi2/caoyi3

WORKDIR也可以解析环境变量

ENV DIR /path

WORKDIR $DIR

ARG

ARG 设置变量命令,ARG定义了一个变量,在docker build创建的时候,使用 --build-arg =来指定参数
也可以给一个默认值

ARG user1="caoyi"

ONBUILD

ONBUILD [INSTRUCTION]

只对当前的子镜像生效

ONBUILD RUN touch caoyi.txt

STOPSIGNAL

当容器退出时发送一个什么样的指定给系统

HEALTHCHECk

容器健康状况检查:

1:HEALTHCHECK [OPTIONS] CMD command 是在容器内部运行一个命令来检查容器的健康状况

2: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秒

标签:容器,RUN,CMD,命令,ENTRYPOINT,镜像,dockerfile
来源: https://www.cnblogs.com/cy888888/p/12953264.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有