Docker学习(四) Dockerfile

Dockerfile 由一系列Dockerfile指令构成,用于创建一个自定义image, 可以通过Dockerfile来描述构建镜像的步骤,并自动构建一个容器。Dockerfile指令忽略大小写,但是建议使用大写。

Dockerfile 命令格式:
INSTRUCTION arguments

MAINTAINER命令
#用于指定维护者的姓名和联系方式
MAINTAINER cbc, cbc@chenbaocheng.com
FROM命令
# 设置基于哪个image创建新的image,所以 FROM 应是 Dockerfile 里的第一条指令。如果没有指定tag, 默认tag是latest。

FROM <image>
或
FROM <image>:<tag>

RUN命令
# RUN命令会在上面FROM指定的镜像里执行任何命令,然后提交(commit)结果。RUN是在building image时会运行的指令, 在Dockerfile中可以写多条RUN指令.

RUN <command> (the command is run in a shell - `/bin/sh -c`)
或
RUN ["executable", "param1", "param2" ... ]  (exec form)

#RUN命令等价于:
docker run image command
docker commit container_id
ENTRYPOINT命令
#容器启动时执行的命令,如果写多条, 只有最后一条生效。

ENTRYPOINT ["cmd", "param1", "param2"...]
或
ENTRYPOINT cmd param1 param2 ...

#举个例子
cbc ~ # cat Dockerfile
FROM tomcat
ENTRYPOINT echo "Hello world!"

cbc ~ # docker run 62fda5e450d5
Hello world!
CMD命令
#容器启动时执行的命令,如果写多条, 只有最后一条生效。
CMD ["executable","param1","param2"] (like an exec, preferred form)
或
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
或
CMD command param1 param2 (as a shell)
#CMD和ENTRYPOINT是在运行container时会运行的指令, 都只能写一条, 如果写多条, 只有最后一条生效。CMD在运行时会被command覆盖, ENTRYPOINT不会被运行时的command覆盖, 如需要覆盖ENTRYPOINT使用参数—entrypoint=。CMD和ENTRYPOINT一般用于制作具备后台服务的image, 例如apache, mysql等. 在使用这种image启动container时, 自动启动相关服务.下面的示例 psql 会覆盖 Dockerfile 里的 CMD
docker run postgres:9.3.5 psql 
USER命令
#指定 ENTRYPOINT 执行命令时的运行用户,下面的例子是指开机启动 NGINX 时用 www 用户身份启动。

ENTRYPOINT ["nginx"]
USER www
EXPOSE命令
#设置镜像运行时对外暴露的端口
EXPOSE <port> [<port>...]
ENV命令
#设置环境变量,设置后,后续的RUN命令都可以使用该环境变量
ENV <key> <value>
ADD命令
#从src复制文件到容器的dest路径。src可以是文件、目录或一个远程url。
ADD <src> <dest>
VOLUME命令
#创建一个挂载点用于共享目录
VOLUME ["<mountpoint>"]
WORKDIR命令
#为RUN, CMD, ENTRYPOINT命令设置当前工作路径
WORKDIR /path/to/workdir
ONBUILD命令
#ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行