首页 > Docker > Docker 第六章(Dockerfile指令)
2015
12-20

Docker 第六章(Dockerfile指令)

在上一章中我们已经使用了Dockerfile的部分指令,例如RUN和EXPOSE,但是它还有很多的指令,下面我们就看详细的看一下这些指令

一、Dockerfile指令

1、CMD

容器启动时运行的命令,有点类似于RUN

二者的区别是:RUN是在构建容器时运行的命令,CMD是在容器启动时运行的命令

1.1、代码演示

查看Dockerfile文件

[root@localhost ~]# cd Tshare365_web/
[root@localhost Tshare365_web]# cat Dockerfile 
# VERSION 0.0.1
FROM ubuntu:14.04
MAINTAINER Tshare365  "tshare365@com"
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
RUN apt-get update
RUN apt-get install  -y  nginx
CMD ["/bin/bash"]
EXPOSE 80

重新构建

[root@localhost Tshare365_web]# docker build -t="tshare365/tshare365_web" .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04
 ---> d55e68e6cc9c
Step 1 : MAINTAINER Tshare365  "tshare365@com"
 ---> Using cache
 ---> 87fef334e7fc
Step 2 : RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
 ---> Using cache
 ---> f381009adccf
Step 3 : RUN apt-get update
 ---> Using cache
 ---> 8b27147ab111
Step 4 : RUN apt-get install  -y  nginx
 ---> Using cache
 ---> dbf024451d71
Step 5 : CMD /bin/bash
 ---> Running in 5aa2a72faac3
 ---> 330bb29b4de1
Removing intermediate container 5aa2a72faac3
Step 6 : EXPOSE 80
 ---> Running in b8483708b89b
 ---> e2c3697dedaf
Removing intermediate container b8483708b89b
Successfully built e2c3697dedaf

启动容器时并执行CMD指令

[root@localhost Tshare365_web]# docker run -t -i tshare365/tshare365_web
root@f990e141c709:/# 
root@f990e141c709:/#

注意:docker run中的命令行参数会覆盖了CMD指令中的指定命令

2、ENTRYPOINT

此指令和CMD指令类似,ENTRYPOINT只是不会被覆盖,实际上docker run 命令行中指定的任何参数都会被当做参数再次传递给ENTRYPOINT中指定的命令,还是不理解看下面的列子

2.1、ENTRYPOINT代码演示

查看Dockerfile

[root@localhost Tshare365_web]# cat Dockerfile 
# VERSION 0.0.1
FROM ubuntu:14.04
MAINTAINER Tshare365  "tshare365@com"
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
RUN apt-get update
RUN apt-get install  -y  nginx
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
EXPOSE 80

[root@localhost Tshare365_web]#

重新构建

[root@localhost Tshare365_web]# docker build -t="tshare365/tshare365_web" .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04
 ---> d55e68e6cc9c
Step 1 : MAINTAINER Tshare365  "tshare365@com"
 ---> Using cache
 ---> 87fef334e7fc
Step 2 : RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
 ---> Using cache
 ---> f381009adccf
Step 3 : RUN apt-get update
 ---> Using cache
 ---> 8b27147ab111
Step 4 : RUN apt-get install  -y  nginx
 ---> Using cache
 ---> dbf024451d71
Step 5 : ENTRYPOINT /usr/sbin/nginx -g daemon off;
 ---> Using cache
 ---> a0037e9fdca4
Step 6 : EXPOSE 80
 ---> Using cache
 ---> 7229fa312967
Successfully built 7229fa312967

docker run 命令启动容器并执行了ENTRYPOINT的指令blob.png

从上面的例子来看似乎与CMD指令并无区别,下面我们在docker run 传入参数看一下

2.2、docker run 传入参数演示

先stop刚刚启动的容器,去掉在Dockerfile中去掉ENTRYPOINT中的参数

blob.png

使用docker run 命令启动并传入参数

blob.png

通过上面的演示我们就可以发现ENTRYPOINT与CMD的不同了,ENTRYPOINT中的指令可以在docker run中传参数而CMD不能

2.3、ENTRYPOINT和CMD二者配合使用,将CMD的参数传入ENTRYPOINT中

[root@localhost Tshare365_web]# cat Dockerfile 
# VERSION 0.0.1
FROM ubuntu:14.04
MAINTAINER Tshare365  "tshare365@com"
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
RUN apt-get update
RUN apt-get install  -y  nginx
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]
EXPOSE 80

[root@localhost Tshare365_web]#

重新构建

[root@localhost Tshare365_web]# docker build -t="tshare365/tshare365_web" .

启动容器执行了-h命令

blob.png

3、WORKDIR

从镜像创建容器时,在容器内部设置一个工作目录,工作目录设置之后下面的命令就会在这个里面执行

[root@localhost Tshare365_web]# cat Dockerfile 
# VERSION 0.0.1
FROM ubuntu:14.04
MAINTAINER Tshare365  "tshare365@com"
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
RUN apt-get update
RUN apt-get install  -y  nginx
WORKDIR /user/local
EXPOSE 80
[root@localhost Tshare365_web]# docker build -t="tshare365/tshare365_web" .
[root@localhost ~]# docker run -t -i tshare365/tshare365_web  "pwd"
/user/local
[root@localhost ~]#

使用-w 标志在运行时覆盖Dockerfile中的工作目录

[root@localhost Tshare365_web]# docker run -i -t -w /tmp tshare365/tshare365_web /bin/bash
root@7703ed19a464:/tmp# pwd
/tmp
root@7703ed19a464:/tmp#

4、ENV用来在构建过程中设置环境变量

blob.png

重新构建,并启动容器

[root@localhost Tshare365_web]# docker build -t="tshare365/tshare365_web" .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04
 ---> d55e68e6cc9c
Step 1 : MAINTAINER Tshare365  "tshare365@com"
 ---> Using cache
 ---> 87fef334e7fc
Step 2 : RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
 ---> Using cache
 ---> f381009adccf
Step 3 : RUN apt-get update
 ---> Using cache
 ---> 8b27147ab111
Step 4 : RUN apt-get install  -y  nginx
 ---> Using cache
 ---> dbf024451d71
Step 5 : ENV TARGET_DIR /user/local
 ---> Running in 67e6fd745e56
 ---> bf413860a740
Removing intermediate container 67e6fd745e56
Step 6 : WORKDIR $TARGET_DIR
 ---> Running in 956bd6a8068e
 ---> b82c0a6d5cdb
Removing intermediate container 956bd6a8068e
Step 7 : EXPOSE 80
 ---> Running in 5f8a6665f7ca
 ---> 6acf359d8074
Removing intermediate container 5f8a6665f7ca
Successfully built 6acf359d8074

启动容器后发现目录改变了,环境变量生效了

blob.png

Dockerfile中的环境变量并被持久保存起来

blob.png

使用命令行的-e标志来传递环境变量,但是这些变量只是在运行时有效

blob.png

5、ADD:复制文件指令 

5.1、source可以是本地的文件

ADD nginx.conf  /etc/nginx/conf

5.2、Source可以是URL

ADD http://nginx.org/download/nginx-1.9.9.tar.gz  /usr/local/nginx-1.9.9.tar.gz

5.3、Source 如果是归档压缩文件,Docker会自动解压

ADD nginx-1.9.9.tar.gz    /usr/local/nginx/

6、COPY指令

类似于ADD,他们的根本不同是COPY只是复制本地文件,也不会去做文件的解压工作

COPY nginx.conf  /etc/nginx/conf

7、USER

用来指定该镜像会以什么样的用户去运行

使用nginx用户去启动这个容器

USER nginx

8、VOLUME

授权访问从容器内到主机上的目录。

VOLUME ["/data1", "/data2"]

这条指令将会为基于此镜像创建的任何容器创建一个名为/data1 和/data2的挂载点

9、ONBUILD

为镜像添加触发器,当一个镜像被用做其他镜像的基础镜像时,该镜像中的触发器会被执行

触发器会在构建过程中插入新指令,触发器可以是任何构建命令比如

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

总结

 本章docker内容就到此结束了,如果你对docker感兴趣,请持续关注Tshare365谢谢!




最后编辑:
作者:tshare365
这个作者貌似有点懒,什么都没有留下。
捐 赠您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击

留下一个回复