Dockerfile notes

构建镜像

docker build -t hary/ubuntu-java8:1.0  .

常用几个Dockefile中的命令

FROM ubuntu            # 从哪里继承  ubuntu:14.04  hary/ubuntu:14.04
MAINTAINER hary 
ENV  DT_HOME  /app/dt  # 设置环境变量, 程序中可以使用ENV设置的环境变量
ADD  file.tar /app     # 会建立/app/file目录, file.tar是相对于Dockerfile所在目录的
VOLUME  /app/dt/log    # 可以将本地目录挂载到/app/dt/log下。 在run的时候使用参数 -v local-path:/app/dt/log
WORKDIR /app/dt        # 切换目录, 可以在Dockerfile中多次切换目录!, 对RUN, CMD, ENTRYPOINT有效
EXPOSE 8080            # 开启内部服务端口, 启动时可用参数:  -p 127.0.0.1:33301:8080 将外部33301映射到8080
USER                   # 使用哪个用户跑container

区别CMD ENTRYPOINT

CMD

1> CMD ["executable","param1","param2"] (exec form, this is the preferred form)
2> CMD ["param1","param2"]  提供默认参数给ENTRYPOINT
3> CMD command param1 param2 和1一样

CMD的主要作用是为容器提供默认的执行命令, 或者给Entry Point提供默认的参数

ENTRYPOINT

ENTRYPOINT ["executable", "param1", "param2"] (exec form, the preferred form)
ENTRYPOINT command param1 param2 (shell form)

Dockerfile中只能有一个ENTRYPOINT ENTRYPOINT主要是用来提供容器执行一直部分, ENTRYPOINT可以被继承。

举例如下

Dockerfile A 构建出的镜像是 hary/a

FROM ubuntu:14.04
CMD ["-l"]
ENTRYPOINT ["ls"]

Dockerfile B 从hary/a继承, 生成的镜像是hary/b

FROM hary/a
CMD ["-l", "/var"]

执行如下:

docker run -it  --rm hary/a        # 实际执行的就是 ls -l
docker run -it  --rm hary/a  /usr  # 实际执行的就是 ls /usr
docker run -it  --rm hary/b        # 实际执行的就是 ls -l /var
docker run -it  --rm hary/b -a /root/  # 实际执行的就是 ls -a /root

可以看到:
如果容器启动时带参数, 则覆盖CMD的的参数
如果容器启动时不带参数,则用CMD的参数作为ENTRYPONIT的参数
如果容器没有ENTRYPOINT, 则默认用CMD的启动
如果容器没有ENTRYPOINT, 可以在启动时重新提供启动命令

Published: November 11 2014