FROM
FROM scratch # 制作base imageFROM centos # 使用base imageFROM ubuntu:14.04复制代码
LABEL
- 类似代码注释
RUN
RUN yum update && yum install -y vim \ python-dev # 反斜线换行复制代码
因为每运行一次RUN,image都会生成新的一层,避免无用分层,合并多条命令成一行
WORKDIR
- 类似cd命令,指定工作目录
WORKDIR /root复制代码
尽量使用绝对目录
WORKDIR /test # 如果没有会自动创建test目录WORKDIR demoRUN pwd # 输出结果应该是 /test/demo复制代码
ADD COPY 两者类似,把本地文件添加到docker image中 区别:ADD 不光添加到指定目录,而且会解压 大部分情况,COPY优于ADD 添加原创文件/目录,使用curl或wget
ADD hello /复制代码
ADD test.tar.gz / # 添加到根目录并解压复制代码
WORKDIR /rootADD hello test/ # /root/test/hello复制代码
ENV 尽量使用ENV,增加可维护性
ENV MYSQL_VERSION 5.6 # 设置常量RUN apt-get install -y mysql=server= "${MYSQL_VERSION}" \ && RM -RF /var/lib/apt/list/* #引用常量复制代码
RUN:
- 执行命令并创建新的Image layer
ENTRYPOINT:
- 让容器以应用程序或者服务的形式运行
- 不会被忽略,一定会执行
- 最佳实践:写一个shell脚本作为entrypoint
COPY docker-entrypoint.sh /usr/local/binENTRYPOINT ["docker-entrypoint.sh"]EXPOSE 27017CMD ["mongod"]复制代码
CMD:设置容器启动时默认执行的命令和参数
- 如果docker run指定了其他命令,CMD命令将被忽略
- 如果定义了多个CMD,只有最后一个会执行
FROM centosENV name DockerCMD echo "hello $name"复制代码
运行以上Dockerfile
$ docker run [image] # 输出 hello Docker$ docker run -it [image] /bin/bash # 不会输出 hello Docker复制代码
VOLUME EXPOSE
可参考docker—library 学习