高手的存在,就是让服务10亿人的时候,你感觉只是为你一个人服务......

dockerfile中的RUN、CMD和ENTRY

目录
  1. 1. 用法
  2. 2. 需要注意
    1. 2.1. 以下无效方式:
    2. 2.2. 这样有效:

最近在学习dockerfile,有几条指令着实比较混淆,RUN,CMD,ENTRYPOINT。
在此记录一下用法,回头好多看看!

用法

RUN在构建image时运行的指令, 在Dockerfile中可以写多条RUN指令.
CMDENTRYPOINT则是在运行container 时会运行的指令, 都只能写一条, 如果写了多条, 则最后一条生效.
CMDENTRYPOINT区别是: CMD在运行时会被command覆盖, ENTRYPOINT不会被运行时的command覆盖

CMD和ENTRYPOINT比较让人费解,举个例子就明白了:

docker run [OPTIONS] IMAGE [COMMAND] [ARG…] –entrypoint=””
docker run -ti tony/web1 /opt/resin.sh start

这里的/opt/resin.sh start就是command,将覆盖Dockerfile的CMD, 但是不会覆盖ENTRYPOINT.
如果要覆盖ENTRYPOINT, 那么可以在docker run运行时输入 –entrypoint=”….”.

CMD和ENTRYPOINT一般用于制作具备后台服务的image, 例如apache, database等. 在使用这种image启动container时, 自动启动服务


需要注意

在Docker daemon模式下,无论你是使用ENTRYPOINT,还是CMD,最后的命令,一定要是当前进程需要一直运行的,才能够防容器退出。

以下无效方式:

ENTRYPOINT service tomcat7 start #运行几秒钟之后,容器就会退出 CMD service tomcat7
start #运行几秒钟之后,容器就会退出

这样有效:

ENTRYPOINT service tomcat7 start && tail -f
/var/lib/tomcat7/logs/catalina.out

或者

CMD service tomcat7 start && tail -f
/var/lib/tomcat7/logs/catalina.out

这样也有效:

ENTRYPOINT [“/usr/sbin/sshd”] CMD [“-D”]