dockerfile

来源:互联网 发布:redis 查询当前数据库 编辑:程序博客网 时间:2024/05/18 11:40
Dockerfile由一行行命令语句组成,并且支持以 # 开头的注释行。


一般地,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。


四部分:

指令


基础镜像信息
FROM

维护者信息
MAINTAINER

镜像操作指令
RUN、COPY、ADD、EXPOSE等

容器启动时执行指令
CMD、ENTRYPOINT



关键字:


FROM
基于哪个镜像

MAINTAINER
镜像创建者

RUN
执行命令

CMD
Container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD

ENTRYPOINT
container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条
ENTRYPOINT与cmd差异:
差异1:CMD指令指定的容器启动时命令可以被docker run指定的命令覆盖,而ENTRYPOINT指令指定的命令不能被覆盖,而是将docker run指定的参数当做ENTRYPOINT指定命令的参数。
差异2:CMD指令可以为ENTRYPOINT指令设置默认参数,而且可以被docker run指定的参数覆盖。

USER
使用哪个用户跑container

EXPOSE
container内部服务开启的端口, 主机上要用还得在启动container时,做host-container的端口映射

ENV
用来设置环境变量

ADD
将文件<src>拷贝到container的文件系统对应的路径<dest>
所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0
如果文件是可识别的压缩格式,则docker会帮忙解压缩
如果要ADD本地文件,则本地文件必须在 docker build <PATH>,指定的<PATH>目录下
如果要ADD远程文件,则远程文件必须在 docker build <PATH>,指定的<PATH>目录下。比如:
docker build github.com/creack/docker-firefox
docker-firefox目录下必须有Dockerfile和要ADD的文件
ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。

VOLUME
可以将本地文件夹或者其他container的文件夹挂载到container中。

WORKDIR
切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效

ONBUILD
ONBUILD指令可以为镜像添加触发器。其参数是任意一个Dockerfile 指令。
当我们在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响。
但是当我们编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。
需要注意的是,如果是再利用B镜像构造新的镜像时,那个ONBUILD指令就无效了,也就是说只能再构建子镜像中执行,对孙子镜像构建无效。其实想想是合理的,因为在构建子镜像中已经执行了,如果孙子镜像构建还要执行,相当于重复执行,这就有问题了。
利用ONBUILD指令,实际上就是相当于创建一个模板镜像,后续可以根据该模板镜像创建特定的子镜像,需要在子镜像构建过程中执行的一些通用操作就可以在模板镜像对应的dockerfile文件中用ONBUILD指令指定。 从而减少dockerfile文件的重复内容编写。

dockerfile 实例:
FROM centosMAINTAINER lycRUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-develADD http://nginx.org/download/nginx-1.8.0.tar.gz .RUN tar zxvf nginx-1.8.0.tar.gz RUN mkdir -p /usr/local/nginxRUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make installEXPOSE 80


创建目录centos_ngx, 保存上面的docker文件重命名为Dockerfile, 保存到centos_ngx中
docker build centos_ngx
...
Step 7 : RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install
 ---> Using cache
 ---> 784dfc005207
Step 8 : EXPOSE 80
 ---> Using cache
 ---> f6d6076737c1
Successfully built f6d6076737c1


docker run -itd -P --name ngx 6b6e66049cbf /bin/bash
docker exec -it f2841726548f /bin/bash
ls /usr/local/nginx/
conf  html  logs  sbin