Dockerfile指令:

Stella981
• 阅读 479
Dockerfile指令:
第一行注释,指令是大写字母开头,
FROM指令:
FROM<image>,后面跟镜像名,
FROM<image>:<tag>,后面跟镜像名和标签名,
必须是已经存在的镜像,后续指令都是基于这个镜像来执行的,这个镜像也叫基础镜像,必须是第一条非注释指令,FROM ubuntu:14.04通过镜像名和标签名指定。
MAINTAINER指令:作者信息
RUN:镜像中运行的命令。
RUN<command> :shell模式
/bin/sh -c command
RUN echo hello
RUN[“executable”,”param1”,”param2”]:exec模式
RUN [“bin/bash”,”-c”,”echo hello”]
EXPOSE:运行该镜像的容器的端口,容器运行时仍需要指定端口号,$docker run -p 80 -d dormancypress/df_test1 nginx -g “daemon off;”,也就是说在dockerfile中使用EXPOSE指定的端口只是告诉docker该容器内的应用程序会使用80端口,但是出于安全的考虑,docker并不会自动的打开端口,而需要在使用时在run命令中添加端口的映射指令。

前面讲过镜像分层的概念,每一个run指令都会在当前镜像的上层创建一个新的镜像来运行指定的命令

Dockerfile指令:

CMD指令用来提供容器运行的默认命令,与run类似都是执行一个命令,run的命令是在镜像构建过程中运行的,cmd是在容器运行时运行的。使用docker run启动一个容器时如果指定了容器运行时的命令,那么cmd指定的指令会被覆盖不会执行。
Cmd指令的两种模式:shell模式和exec模式
CMD [“executable”,”param1”,”param2”] (exec模式)
CND command param1 param2 (shell模式)
CMD[“param1”,”param2”],这种模式只是指定了一些参数,通常与entrypoint指令搭配使用,提供entrypoint指令的默认参数。

创建一个文件夹yw,在里面创建一个Dockerfile文件,写入命令。然后使用这个文件来构建一个镜像,
yw1989@ubuntu:~/dockerfile$ vim Dockerfile
yw1989@ubuntu:~/dockerfile$ ls
Dockerfile
yw1989@ubuntu:~/dockerfile$ docker build -t="yw" .  ,yw是镜像的名字,
Successfully built ac295159e422
Successfully tagged yw:latest
构建完成后使用这个镜像来运行一个容器
yw1989@ubuntu:/home$ docker run -p 80 --name yw_jingxiang_contain1 -d yw (yw是刚才创建的镜像的名字,dockerfile已经指定了run指令,创建容器的时候就不用指定容器启动的指令了),
5336ddeca5c4b4636b026ca034371175df1ddbb2ed03048de608d4f15f16dca6

docker ps查看容器,docker top yw_jingxiang_contain1查看容器中运行的进程。$docker run -p 80 --name yw_jingxiang_contain2 -d yw /bin/bash:yw_jingxiang_contain2容器运行的是 /bin/bash这个在docker run命令中指定的命令,不运行dockerfile里面的命令了,将里面的指令覆盖了。

ENTRYPOINT指令:exec模式,shell模式
ENTRYPOINT [“executable”,”param1”,”param2”]:exec模式
ENTRYPOINT command param1 param2:shell模式
ENTRYPOINT指令跟cmd指令不同之处在于不会被docker run中指定的启动指令覆盖。如果需要覆盖ENTRYPOINT指令在docker run中指定entrypoint选项。
$docker run -p 80 --name yw_jingxiang_contain2 -d yw /bin/bash并没有覆盖dockerfile中entrypoint指令。
Cmd指令和entrypoint指令组合使用,用entrypoint指定命令用cmd指定命令的参数。

ADD,COPY : 指令,都是将文件或者目录复制到使用dockerfile构建的镜像中。文件或者目录的地址可以是本地地址也可以是远程的url。如果是本地地址是构建目录中的相对地址,对于远程url,docker并不推荐使用,更建议使用curl或者是wget之类的命令来获取文件。目标路径需要指定镜像中的绝对路径。

Dockerfile指令:

VOLUME[“/data”] : 像基于镜像创建的容器添加卷,一个卷可以存在一个或者多个容器的特定目录,这个目录可以绕过联合文件系统并提供如共享数据或者对数据持久化的功能。

WORKDIR指令 :在容器内部设置工作目录,CMD和ENTRYPOINT指定的命令都会在这个目录执行,在构建中为后续的指令指定工作目录。通常使用绝对路径,如果使用相对路径会一直传递下去。如下图:

Dockerfile指令:

ENV指令 : 用来设置环境变量,环境变量可以作用于构建和运行过程。

USER daemon:镜像以什么用户去运行。USER nginx:基于该镜像启动的容器会以nginx的身份运行,不使用USER指定用户,默认是root用户。

Dockerfile指令:

ONBUILD [INSTRUCTION] : 为镜像添加触发器,当一个镜像被用作其他镜像的基础镜像时,这个触发器会被执行。子镜像在构建时会插入触发器中的指令(时机)。

Dockerfile的构建过程:
1.从基础镜像运行一个容器:FROM指令指定的镜像名。
2.执行一条指令,对容器做出修改。
3.对修改后的容器执行类是connit的操作,提交一个新的镜像层。
4.根据这个新的镜像层运行一个容器。
5.继续执行dockerfile中的下一条指令,直至所有指令执行完毕。

#first dickerfile

FROM ubuntu
MAINTAINER yw "yw@qq.com"
ENV date 2018
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80

Running in 2c193a7b6028 :running in 后面的id是运行命令的容器id,返回的结果是提交后新的镜像层的id。Build最后返回建立的id。也就是前面的中间层镜像id。得到中间层镜像id后删除中间层建立的容器不删除中间层建立的镜像,也就是说可以使用docker run命令通过中间层镜像运行一个容器:Docker  run  -it 中间层镜像容器id  /bin/bash。在这个镜像中安装nginx,可以通过whereis nginx来查看这个镜像中有没有安装nginx。中间层镜像可以查找dockerfile构建过程中的错误。

Docker会将每一步的构建的镜像当成缓存,
root@ubuntu:/yw# docker build -t="yw" .
Sending build context to Docker daemon 2.048 kB
Step 1/6 : FROM ubuntu
 ---> 0458a4468cbc
Step 2/6 : MAINTAINER yw "yw@qq.com"
 ---> Using cache
 ---> 359e4919da8e
Step 3/6 : ENV date 2018
 ---> Using cache
 ---> 4c23bef107fb
Step 4/6 : RUN apt-get update
 ---> Using cache                        //使用了缓存
 ---> 39a7fec08909
Step 5/6 : RUN apt-get install -y nginx
 ---> Using cache
 ---> 66046f80f875
Step 6/6 : EXPOSE 80
 ---> Using cache
 ---> 3037df54c783
Successfully built 3037df54c783

有些时候不想使用构建缓存,比如构建命令中包含apt-get update的时候,希望每次都去刷新apt包的缓存,每次都是最新的版本。docker build -t="yw"  --no-cache  .  。

查看镜像的构建过程:
$docker history [image],
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
2年前
Docker:dockerfile构建php项目 [八]
一、把项目封装成docker镜像的步骤把项目封装成docker镜像的步骤:1、先运行一个基础容器,手动制作docker镜像2、编写dockerfile,构建镜像3、测试运行二、dockerfile常用指令参考1、dockerfile常用指令:
Stella981 Stella981
2年前
Dockerfile构建镜像及相关命令
Dockerfile镜像描述文件Dockerfile是一个包含用于组合镜像的命令的文本文档Docker通过读取Dockerfile中的指令按步自动生成镜像dockerbuildt机构/镜像名<:tagsDockerfile目录Dockerfile基础命令FROM基
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Dockerfile 详解
一.Dockerfile基本结构一般的,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。’’为Dockerfile中的注释。先看下面一个小例子:ThismyfirstnginxDockerfileVersion1.0
Stella981 Stella981
2年前
Dockerfile指令详解
Dockerfile中包括FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD等13个指令。下面一一讲解。1.FROM格式为FROMimage或FROMimage:tag,并且Dockerfile中第一条指令必须是FROM指令
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这