Dockerfile 指令详解

Dockerfile 指令详解

2016年03月11日 13:58:34 阅读数:13373python

Docker建立镜像的方式有两种:

一种经过commit的方式:把作了一系列操做的容器关闭,而后利用docker的commit指令:dockercommit 容器ID 镜像名:tag。而后dockerpush到镜像仓库。别人pull下来的再次启动的时候,就是你当前的操做的形态。git

另外一种是经过Dockerfile构建的方式:把操做的步骤经过脚本的形式写下来,而后构建的时候,Docker会按照你写的步骤,一步一步构建。这是目前主流的构建方式。docker

 

Dockerfile指令说明

FROM:

格式为 FROM<image> 或 FROM<image>:<tag>shell

第一条指令必须是FROM指令。而且,若是在同一个Dockerfile中建立多个镜像时,可使用多个FROM指令(每一个镜像一次)。数据库

MAINTAINER:格式为MAINTAIER<name>,指定维护者信息。windows

RUN:

格式为RUN <command>或者RUN [“executable”,“param1”,“param2”]。bash

前者将在shell终端中运行的命令,即/bin/sh–c;后者则使用exec执行。指定使用其余终端能够经过第二种方式实现,例如RUN[“/bin/bash”,“-c”,“echohello”]。每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可使用\来换行。app

这实际上就是在容器构建时须要执行哪些指令,例如容器构建时须要下拉代码,可是默认启动的容器中是没有git指令的,就须要下载,能够执行:RUN apt-get install -y git,而后RUN git clonexxxxelasticsearch

CMD:

指定容器启动后执行的命令,通常都是早就写好的脚本,例如:CMD[“/run.sh”]。注意:若是Dockerfile中指定了多条命令,只有最后一条会被执行。若是用户启动时候加了运行的命令,则会覆盖掉CMD指定的指令。ui

 

EXPOSE:

告诉Docker服务端容器须要暴露的端口号,供互联系统使用。在启动容器时须要经过-P(注意是大写),Docker主机会自动分配一个端口转发到指定的端口;使用-p,则能够具体指定哪一个本地端口映射过来。

例如:我在elasticsearch镜像的Dockerfile中指定了暴露出9200和9300端口,我能够在Dockerfile中写:

 

因而,这俩端口就暴露出来了,可是外界想访问的话若是不在启动的时候加上对应的映射到本地端口,Docker就会自动分配一个端口,经过dockerps 能够找到Docker自动分配了

哪一个端口。

 

若是加上映射:docker run –p 9200:9200 –p 9300:9300 elasticsearch

 

这样,经过本机的9200端口和9300端口就能够访问Docker容器了。

ENV:

一、建立的时候给容器中加上个须要的环境变量。二、指定一个值,为后续的RUN指令服务

ADD:

将复制指定的的文件复制到容器中。格式为 ADD  <src> <dest>    src必须为Dockerfile所在位置的相对路径,也能够是一个URL;还能够是一个tar文件(自动解压为目录)

COPY:

复制本地的文件或目录到容器中。目标路径不存在时,会自动建立。(和ADD相似,我的没发现啥区别)

ENTRYPOINT:

配置容器启动后执行的命令,而且不可被dockerrun 提供的参数覆盖。

每一个Dockerfile中只能有一个ENTRYPOINT,当指定多个ENTRYPOINT时,只有最后一个生效。和CMD类似,却有不一样。

 

VOLUME:

[“/data”]建立一个挂在点,能够从本机或其余容器挂载的挂载点。意思就是从容器中暴露出一部分,和外界共享这块东西,通常放数据库的数据或者是代码。在容器启动运行的时候,若是须要将volume暴露的东西和本地的一个文件夹进行映射,想要经过本地文件直接访问容器中暴露的部分,能够在运行的时候进行映射:

docker run –v 本地路径:容器须要挂载的路径image 

可是有一个问题,在构建完毕第一次进行启动的时候,会以映射的本地环境为主,因此若是说本地环境为空,那么对应的容器中的文件将会变为空。

若是不指定本地的映射目录,那么docker会自动映射一个目录到本地(Mac和windows是被映射到docker machine中了),能够经过指令 docker inspect  container_name 来查看具体位置

 

USER:

指定运行容器时的用户名或者UID,后续的RUN也会使用指定的用户。当服务不须要管理员权限时,能够经过该命令指定运行用户。而且能够在以前建立所须要的用户。

要临时获取管理员权限的时候要使用gosu,不推荐使用sudo。若是不指定,容器默认是root运行。

WORKDIR:

定义工做目录,若是容器中没有此目录,会自动建立

ONBUILD:

配置当所建立的景象做为其余新建立景象的基础镜像时,所执行的操做指令。

例如,Dockerfile使用以下内容建立了镜像image-A

 

FROM image-A

#自动添加

ADD . /app/src

RUN /usr/local/bin/python-build–dir/app/src

相关文章
相关标签/搜索