一、FROM
选择构建Docker image的base image。
FROM scratch # 制作base image
FROM centos # 使用centos image作为base image
二、LABEL
image的相关描述。
LABEL maintainer="[email protected]"
LABEL version="1.0"
LABEL description="This is description"
三、RUN
每执行一次RUN,image就会分层。为了避免无用分层,通过&&
符号可以合并成一层。
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
四、WORKDIR
设定当前工作目录,和cd
命令相似。
WORKDIR /test # 如果没有会自动创建test目录
WORKDIR file
RUN pwd # 输出结果应该是/test/file
五、ADD、COPY
把本地文件添加到Docker image 里面
ADD myFile / # 把当前目录下的myFile文件拷贝到根目录下
ADD test.tar.gz / # 添加到根目录并解压
WORKDIR /root
ADD myFile test/ # /root/test/myFile
ADD和COPY操作相似,大部分情况,COPY优于ADD!ADD除了拷贝还有额外功能(解压),添加远程文件、目录使用curl或wget!
六、ENV
设置常量,增加可维护性!
ENV MYSQL_VERSION 5.6
RUN apt-get install -y mysql-server = "${MTYSQL_VERSION}" \
&& rm -rf /var/lib/apt/lists/* # 引用变量
七、比较RUN、CMD、ENTRYPOINT
RUN:执行命令并创建新的image layer(镜像层)
CMD:设置容器启动后默认执行的命令和参数
ENTRYPOINT:设置容器启动时运行的命令
7.1 CMD
- 容器启动时默认执行的命令
- 如果
docker run -it [image] /bin/bash
指定了其他命令/bin/bash
,则CMD命令会被忽略 - 如果在Dockerfile中定义了多个CMD命令,只有最后一个会执行
Dockerfile文件:
FROM centos
ENV name Docker
CMD echo "hello $name"
7.2 ENTRYPOINT
- 不会被忽略,一定会执行
- 通常用法,写一个shell脚本作为entrypoint
Dockerfile文件:
COPY docker-entrypoint.sh /usr/local/bin
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOST 27017
CMD ["mongod"]