例子
FROM alpine WORKDIR /usr VOLUME /app ENV MY_ENV my_valueCMD ["/"] ENTRYPOINT ["ls"]
构建Dockerfile
docker build -t my-image .
运行该image:
docker run my-image
常用Dockerfile命令
| 命令 | 用途 | 例子 | 
|---|---|---|
| FROM | 设置基础的image | FROM alpine | 
| MAINTAINER | 维护者信息 | MAINTAINER xiaoming | 
| RUN | 在构建image的时候运行的命令 | RUN apt-get update | 
| ADD | 向image中添加文件,可添加URL资源 | ADD /etc/config /etc/config | 
| COPY | 和ADD一样,但只能拷贝宿主机上的文件 | COPY config-file config-file | 
| ENV | 设置环境便令 | ENV MY_ENV_URL http://www.baidu.com | 
| CMD | 在启动contianer的时候运行的命令 | CMD date | 
| ENTRYPOINT | 在启动container的时候运行命令,覆盖CMD | ENTRYPOINT echo | 
| EXPOSE | 声明向外暴露的网络端口 | EXPOSE 80 | 
| VOLUME | 创建一个volume,并mount到container中的指定目录 | VOLUME /app | 
| WORKDIR | 声明工作路径 | WORKDIR /app | 
| HEALTHCHECK | 健康检查 | HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1 | 
CMD和ENTRYPOINT的区别
在默认情况下,CMD和ENTRYPOINT的行为是一样的,都是指定在运行container的时候需要运行的主进程。
CMD和ENTRYPOINT都有shell模式和exec模式,在shell模式下,container的主进程通过sh为入口,在sh中再执行CMD/ENTRYPOINT所指定的命令,在exec模式下,container直接就执行CMD/ENTRYPOINT所指定的命令。
在shell模式下,设置命令如下:
CMD ls / ENTRYPOINT ls /
在exec模式下,设置命令如下:
CMD ["ls", "/"] ENTRYPOINT ["ls", "/"]
在shell模式下,ENTRYPOINT会覆盖CMD。在exec模式下,CMD所设置的参数会成为ENTRYPOINT的参数,如下:
CMD ["/"] ENTRYPOINT ["ls"]
在运行上述Dockerfile所对应的container时:
docker run image
此时的效果相当于执行了ls /,即CMD作为参数跟到了ENTRYPOINT后面。
此时我们也可以在命令行中覆盖CMD:
docker run image /usr
此时则相当于ls /usr。
在运行image时,要覆盖CMD可以直接将覆盖的参数跟到image后面,如果要覆盖ENTRYPOINT则需要通过--entrypoint设置。通常来说,如果我们的container要运行一个应用程序,比如java,那么可以通过ENTRYPOINT设置java命令,然后用CMD设置java程序的默认命令行参数,之后在实际运行的时候再重新指定参数。
EXPOSE
- 如果不使用EXPOSE,那么container中的端口只能通过-p向外发布(但是使用非默认bridge网络的container除外) 
- 如果使用了EXPOSE,那么可以通过 - docker run时使用-P将所有EXPOSE的端口映射到宿主机的随机端口
- 如果使用了EXPOSE,那么也可以通过-p向外发布 
Dockerfile最佳实践
请参考Docker官方文档。
作者:无知者云
链接:https://www.jianshu.com/p/b37914d6a865
共同学习,写下你的评论
评论加载中...
作者其他优质文章
 
                 
             
			 
					 
					