Dockerfile 使用基本的基于
DSL语法的指令来构建一个Docker镜像,之后使用docker build命令基于该Dockerfile中的指令构建一个新的镜像。
构建一个包含可执行文件的Docker镜像,并运行。
#include<stdio.h> int main(void) { printf("hello docker !"); return 0; } 

FROM scratch # FROM 指定一个已经存在的镜像(基础镜像 base image), 制作base image ADD hello / # 添加到根目录 CMD ["/hello"] # CMD 指令用于指定一个容器启动时要运行的命令 (3)docker build
sudo docker build -t donaldy/hello-world . 
官方文档 : https://docs.docker.com/engine/reference/builder/#known-issues-run
(1)FROM
尽量使用官方的image作为base image
FROM scratch # 制作base image FROM centos # 使用base image (2)LABEL
LABEL Metadata 不可少
LABEL maintainer="xxx@yyy.com" LABEL version="1.0" LABEL description="This is description" (3)RUN
RUN : 执行命令并创建新的Image Layer
每使用一层run 就会生成一层 image
为了美观,复杂的RUN请用反斜线换行!
避免无用分层,合并多条命令成一行!
# 反斜线换行 RUN yun update && yun install -y vim \ python-dev # 注意清理cache RUN apt-get update && apt-get install -y perl\ pwgen --no-install-recommends && rm -rf \ /var/lib/apt/lists/* (4)WORKDIR
设定当前工作目录
用WORKDIR,不要用 RUN cd!
尽量使用绝对目录!
WORKDIR /root WORKDIR /test # 如果没有回自动创建test目录 WORKDIR demo RUN pwd # 输出结果应该是 /test/demo (5)ADD and COPY
大部分情况, COPY 优于 ADD!
ADD处理COPY 还有额外功能(压缩)!
添加远程文件/目录请使用curl 或者 wget !
ADD hello / ADD test.tar.gz / # 添加到根目录并解压 WORKDIR /root ADD hello test/ # /root/test/hello WORKDIR /root COPY hello test/ (6)ENV
设定环境变量
尽量使用ENV增加可维护性!
ENV MYSQL_VERSION 5.6 # 设置常亮 RUN apt-get install -y mysql-server= "${MYSQL_VERSION}" \ && rm -rf /var/lib/apt/lists/* # 引用常亮 (7)VOLUME and EXPOSE
存储和网络
(8)CMD and ENTRYPOINT
CMD : 设置容器启动后默认执行的命令和参数
ENTERYPOINT: 设置容器启动时运行的命令
Shell 格式
RUN apt-get install -y vim CMD echo "hello docker " ENTERYPOINT echo "hello docker" Exec 格式
RUN ["apt-get", "install", "-y", "vim"] CMD ["/bin/echo", "hello docker"] ENTERYPOINT ["/bin/echo", "hello docker"] CMD
- 容器启动时默认执行的命令
- 如果docker run指定了其他命令,CMD命令被忽略
- 如果定义了多个CMD,只有最后一个会执行
ENTERYPOINT
- 让容器以应用程序或者服务的形式运行
- 不会被忽略,一定会执行
- 最佳实践: 写一个shell脚本作为entrypoint
COPY docker-entrypoint.sh /usr/local/bin/ ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 27017 CMD ["mongod"]
文章来源: 【Docker】之 Dockerfile