FROM
- 制作 base image
FROM scratch
- 使用 base image
FROM centos
;
FROM unbuntu:14.04
LABEL
LABEL maintainer="jerry@gmail.com"
LABEL version = "1.0"
LABEL description="This is description"
Metadata必不可少
RUN
RUN:执行命令并创建新的Image Layer
RUN yum update && yum install -y vim \
python-dev #反斜线换行
RUN apt-get update && apt-get install -y perl \
pwgen --no-install-recommends && rm -rf \
/var/lib/apt/lists/* #注意清理cache
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
WORKDIR
WORKDIR /root
WORKDIR /text #如果没有会自动创建test目录
WORKDIR demo
RUN pwd #输出结果应该是/test/demo
用WORKDIR,不要用RUN cd!尽量使用绝对目录!
ADD & COPY
ADD hello /
ADD test.tar.gz / #添加到根目录并解压
WORKDIR /root
ADD hello test/ #/root/test/hello
WORKDIR /root
COPY hello test/
大部分情况,copy优于add,add除了copy还有额外功能(解压)。添加远程文件/目录尽量使用curl或者wget。
ENV
ENV MYSQL_VERSION 5.6 #设置常量
RUN apt-get install -y mysql-server= "${MYSQL_VERSION}" \
&& rm -rf /var/lib/apt/lists/* #引用常量
VOLUME & EXPOSE
主要用于存储和网络
CMD & ENTRYPOINT
CMD:
- 设置容器启动后默认执行的命令和参数
- 如果docker run指定了其它命令,CMD命令被忽略
- 如果定义了多个CMD,只有最后一个会执行
FROM centos
ENV name Docker
CMD echo "hello $name"
docker run [image]输出?
Docker run -it [image]/bin/bash输出?
ENTRYPOINT:
- 设置容器启动时运行的命令
- 让容器以应用程序或者服务的形式运行
- 不会被忽略,一定会执行
- 最佳实践:写一个shell脚本作为entrypoint
CPOY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSe 27017
CMD ["mongod"]
两种格式:Shell 和 Excel 格式
- Shell格式:
RUN apt-get install -y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"
- Excel格式:
RUN ["apt-get" , "install" , "-y" , "vim"]
CMD ["/bin/echo","hello docker"]
ENTRYPOINT["/bin/echo","hello docker"]
Dockerfile 示例
- Dockerfile1
FROM centos #定义一个base iamge
ENV name Docker #定义个常量
ENTRYPOINT echo "hello $name" #运行echo命令
- Dockerfile2
FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash","-c","echo hello $name"]