dockerfile镜像构建命令

文章目录

dockerfile镜像构建命令1:FROM2:MAINTAINER3:RUN4:ADD5:COPY6:ENTRYPOINT7:ENV8:EXPOSE9:WORKDIR10:USER11:LABEL12:VOLUME

实例

1:FROM

FROM : Dockerfile中第一条指令必须是FROM指令,表示从哪个基础镜像开始构建镜像

FROM centos:7 //基于centos7基础镜像构建新的镜像

FROM scratch //表示不以任何镜像为基础

2:MAINTAINER

MAINTAINER : 镜像维护者个人信息,维护者的姓名和邮箱

MAINTAINER xuanning@gamil.com //维护者姓名和邮箱

3:RUN

RUN : 构建镜像时需要执行的命令,有两种命令执行方式

shell形式执行

格式:

RUN //RUN后边直接跟shell命令,linux操作系统上默认shell为/bin/sh -c

exec形式执行

格式:

RUN ["executable", "param1", "param2"] //执行可执行文件,executable为可执行文件,param为选项或参数;exec形式可以指定使用其他终端

两种形式对比:

RUN echo "hzz"

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

dockerfile每一条命令为一层,多条命令最好用最少的RUN命令执行,镜像的层数高了造成镜像的臃肿,不仅仅增加了构件部署的时间,还容易出错

4:ADD

ADD :将本地文件添加到构建的镜像中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

ADD ...

ADD ["",... ""] //用于支持包含空格的路径

示例:

ADD test /tmp/ //添加"test"文件到镜像的"/tmp"目录

ADD hom* /mydir/ //添加所有以"hom"开头的文件到镜像的"/mydir"目录

5:COPY

CMD : 指定镜像启动为容器后默认执行的命令,每个 Dockerfile 只能有一条 CMD 命令;如果指定了多条命令,只有最后一条会被执行,如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令

格式:

CMD ["executable","param1","param2"] //执行可执行文件,此方式优先

CMD command param1 param2 //执行shell内部命令

CMD ["param1","param2"] //设置了ENTRYPOINT,则为ENTRYPOINT添加参数

示例:

CMD ["echo","This is a test"]

CMD echo "This is a test"

6:ENTRYPOINT

ENTRYPOINT : 类似于 CMD 指令,但其不会被创建容器时指定的命令覆盖,如果创建容器时指定了命令那么这些命令会被当作参数送给 ENTRYPOINT 指令指定的程序;CMD 和ENTRYPOINT 同在时 CMD 的内容会被当作参数传递给 ENTRYPOINT 指定的命令。

格式:

ENTRYPOINT ["executable", "param1", "param2"] //执行可执行文件, 此方式优先

ENTRYPOINT command param1 param2 //shell内部命令

7:ENV

ENV :设置环境变量。此环境变量为镜像启动为容器之后容器中的环境变量

格式:

ENV //之后的所有内容均会被视为其的组成部分,因此,一次只能设置一个变量

ENV = ... //可以设置多个变量,每个变量为一个"="的键值对,如果中包含空格,可以使用\来进行转义,也可以通过""来进行标示

示例:

ENV myName xuanning

ENV myName="xuanning" myAge="20"

ENV HTTPD_MPM="event"

8:EXPOSE

EXPOSE :指定镜像启动为容器后开放的端口

格式:

EXPOSE [...]

示例:

EXPOSE 80 443

EXPOSE 8080

EXPOSE 11211/tcp 11211/udp

注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。

9:WORKDIR

WORKDIR :工作目录,类似于cd命令

格式:

WORKDIR /path/to/workdir

示例:

WORKDIR /hzz //这时工作目录为/hzz

注:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。

10:USER

USER :指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

格式:

  USER user

  USER user:group

  USER uid

  USER uid:gid

示例:

  USER www

注:使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。

11:LABEL

LABEL指令用于让用户为镜像指定各种元数据(键值对的格式),格式如下。

LABEL multi.label1="value1"

12:VOLUME

VOLUME指令用于在镜像中创建一个挂载点目录。Volume有两种类型:绑定挂载卷和docker管理的卷。在Dockerfile中只支持Docker管理的卷,也就是说只能指定容器内的路径,不能指定宿主机的路径,格式如下。

格式:

VOLUME ["/path/to/dir"]

示例:

VOLUME ["/data"]

VOLUME ["/var/www","/var/log/apache2","/etc/apache2"]

实例

1、基于基础镜像centos:7 2、维护者信息 3、添加Centos-7仓库 4、添加epel-7仓库 5、安装nginx软件包 6、暴露指定端口80 7、构建镜像,镜像名称为nginx:v1 8、运行容器,容器名称为自己名字的全拼,映射端口88:80 9、进入容器,删除默认网页,写入新的默认网页 10、通过浏览器,能够正常访问nginx

[root@server1 ~]# mkdir vv

[root@server1 ~]# cd vv

[root@server1 vv]# ls

Centos-7.repo Dockerfile epel-7.repo

[root@server1 vv]# vim Dockerfile

[root@server1 vv]# cat Dockerfile

FROM centos:7

MAINTAINER xuanning@gamil.com

ADD Centos-7.repo /etc/yum.repos.d/

COPY epel-7.repo /etc/yum.repos.d/

RUN yum -y install nginx

EXPOSE 80

CMD ["/usr/sbin/nginx","-g","daemon off;"]

[root@server1 vv]# docker build -t nginx:v1 .

Sending build context to Docker daemon 6.656kB

Step 1/7 : FROM centos:7

---> eeb6ee3f44bd

Step 2/7 : MAINTAINER xuanning@gamil.com

---> Running in 9298fb7f02d8

Removing intermediate container 9298fb7f02d8

......................

Step 6/7 : EXPOSE 80

---> Running in 16b68cb5e24e

Removing intermediate container 16b68cb5e24e

---> ece6f09d85ea

Step 7/7 :CMD ["/usr/sbin/nginx","-g","daemon off;"]

---> Running in 95c18f5b967d

Removing intermediate container 95c18f5b967d

---> 1a93b23c0e25

Successfully built 1a93b23c0e25

Successfully tagged nginx:v1

[root@server1 vv]# docker run -dit --name cvcv -p 88:80 nginx:v1

add17290c971ab13adca90a1afa0e8d44e10d501fd35042d20d3103f2f53bb4b

[root@server1 vv]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

add17290c971 nginx:v1 "/usr/sbin/nginx -g …" 2 seconds ago Up 1 second 0.0.0.0:88->80/tcp, :::88->80/tcp cvcv

[root@server1 vv]# docker exec -it cvcv /bin/bash

[root@add17290c971 /]# cd /usr/share/nginx/

[root@add17290c971 nginx]# ls

html modules

[root@add17290c971 nginx]# cd html/

[root@add17290c971 html]# ls

404.html 50x.html en-US icons img index.html nginx-logo.png poweredby.png

[root@add17290c971 html]# rm -rf index.html

[root@add17290c971 html]# echo lihao > index.html

[root@add17290c971 html]# ls

404.html 50x.html en-US icons img index.html nginx-logo.png poweredby.png

[root@add17290c971 html]#exit

[root@server1 vv]# systemctl stop firewalld.service

浏览器访问

文章来源

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: