CMD vs RUN vs ENTRYPOINT
CMD命令 :容器启动时默认的命令(一起容器启动时,要运行的命令)。当时如果当运行Container时候声明了 command,则忽略Image中的CMD命令。
CMD的三种定义方法:
CMD<cmd>这个当做 /bin/sh -c "cmd"来执行。
CMD["executable","arg1","arg2"....]
CMD["arg1","arg2"],这个时候CMD作为ENTRYPOINT的参数。
RUN命令:当基于 baseImage 创建新的 Image时,对于 baseImage所有的操作(创建一个文件、执行文件安装等)都可以使用RUN运行一个进行。Dockerfile中可以用多个RUN指定,它们是依次执行。
RUN的两种运行方式:
RUN<CMD> :这个会当做/bin/sh -c "cmd" 运行。
RUN["executable","arg1",...] : Docker把它当做Json序列,而且executable需要完整的路径。
ENTRYPOINT命令:把Container变成一个可执行文件,如果把ENTRYPOINT定义成一个Json格式。CMD不是一个command的效果,它会变成一个参数,添加在 ENTRYPOINT后面。每个Dockerfile只能包含一个ENTRYPOINT,多个ENTRYPOINT指令只有最有一个有效。
注意:当定义ENTRYPOINT以后,CMD只能够作为参数进行传递。
ENTRYPOINT运行方式:
ENTRYPOINT["executable","arg1","arg2"],这种定义方式下,CMD可以通过Json序列的方式来定义ENTRYPOINT的参数,
可以在通过运行 Container的时候通过指定 command的方式传递参数。
新建文件Dockerfile(首字母必须大写)
vim Dockerfile
bseImage: 选择centos
RUN:指定镜像构建时要运行的命令。被创建时镜像 Image时,执行 touch命令,在根目录创建 yqqfile.sh空文件。
CMD: 指定容器启动时默认的命令。
编写完成的Dockerfile文件,可以用 dokcer build 生成 Container。
docker build -t test/osf1 . (最后的 . 是当前路径)
运行自己创建的Container.
运行自己创建的 Container.默认执行的是创建镜像时候的 CMD命令。
但是如果在启动镜像时声明了command,则创建镜像时的CMD命令被忽略。
修改 CMD命令,变成ENTRYPOINT命令。
此时的CMD命令后面的参数变成 ENTRYPOINT的默认参数。
生成镜像
运行镜像
默认执行的是 CMD 参数。
指定参数,显示 / (根目录)下所有文件的详细信息,此时 CMD命令不会起作用。
ADD vs COPY
ADD & COPY 都可以把主机的文件复制到Image中去,这个文件必须在当前的context路径下。
如果Dockerfile当前的目录是A,则只能把 A中或者A以下的文件拷贝到你的目标Image中去。原因是Docker只会把这些文件打包发给 server 端,一旦穿过这个范围,server就找不到这个文件。
ADD可以把网络的url 下载到目标路径中去。
ENV命令
用来设置环境变量,后续的RUN可以使用当前创建的环境变量。当基于该镜像创建Container的时候,会自动拥有设置的环境变量。
ONBUILD命令
ONBUILD作为一个trigger的标记,可以用来trigger任何Dockerfile的指令。可以定义多个ONBUILD指令。
当一个镜像 B 使用镜像 A 作为 Base的时候,在 FROM A指令之前,会先按照顺序执行在构建A 时定义的ONBUILD指令。
VOLUME命令
用来创建一个在image之外的mount point,用来在多个Container之间实现数据共享。