FROM
dockerfile里的第一条指令,后面跟有效的镜像名(如果该镜像你的本地仓库没有则会从远程仓库Pull取)。后面的指令在些镜像中执行。
FROM :
MAINTAINER
MAINTAINER 作者信息
RUN
后跟要执行的linux命令,每一条RUN指令(可能会有多条linux命令)会在当前容器最上面的可读写层执行并且提交成一个新的镜像层,接下来的指令会在这个新的镜像层里执行。
RUN (the command is run in a shell – /bin/sh -c – shell form)
RUN ["executable", "param1", "param2"] (exec form) 注意下面的情况:
不要在一条RUN指令里单一使用apt-get update命令,这样可能会导致以后的apt-get install 安装出错。
避免使用RUN apt-get upgrade 或者dist-upgrade,这样有些重要的软件包可能更新失败,如果你确实想要更新某个包A,使用apt-get install install -y A 。这样会自动更新这个软件包。
更多请参考官方文档。
CMD
CMD指令指定你制作出来的镜像在启动成容器时运行命令的默认的参数。
CMD有三种写法:
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
第一种是可执行文件加参数,第二种是作为ENTRYPOINT的参数,第三种是作为”/bin/sh -c”的参数。
这里CMD与ENTRYPOINT的区别强烈推荐你去看 论docker CMD与ENTRYPOINT的大区别 http://www.iyunv.com/programfish/p/4101884.html 这篇文章。看完你就懂了。
ENTRYPOINT
ENTRYPOINT字面意思指定容器的进入点。可以把你的容器制作成类似可执行文件的用法。这个指令会覆盖它前面的CMD指令,而多个 ENTRYPOINT指令只有最后一个生效(后面覆盖前面)。同时你也可以在在启动container 的时候指定–entrypoint参数来覆盖dockerfile里的ENTRYPOINT。详见官方文档。
例如我用了这样的指令制作镜像名叫echotest:
ENTRYPOINT ["/bin/echo"]
然后之后这样运行:
docker run -it echotest “this is a echo”
实际上是平时这样的命令:
docker run -it echotest /bin/echo “this is a echo”
这样你应该明白了吧。 这样一个容器的行为就很类似一个可执行文件了。 这里CMD与ENTRYPOINT的区别强烈推荐你去看 论docker CMD与ENTRYPOINT的大区别 http://www.iyunv.com/programfish/p/4101884.html 这篇文章。看完你就懂了。 EXPOSE
EXPOSE指定容器对外暴露的端口号。
这里引用官方的一个dockerfile例子:
# Nginx
#
# VERSION 0.0.1
FROM ubuntu
MAINTAINER Victor Vieux
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
# Firefox over VNC
#
# VERSION 0.3
FROM ubuntu
# Install vnc, xvfb in order to create a ‘fake’ display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir ~/.vnc
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c ‘echo “firefox” >> /.bashrc ‘
EXPOSE 5900
CMD ["x11vnc", "-forever" , "-usepw", "-create" ]
# Multiple images example
#
#VERSION 0.1
FROM ubuntu
RUN echo foo > bar
# Will output something like ===> 907ad6c2736f
FROM ubuntu
RUN echo moo > oink
# Will output something like ===> 695d7793cbe4
# You?ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with
# /oink.