1、Dockerfile指令
(1)指令格式 ①注释 #Comment
②指令 INSTRUCTION argument
(2)第一个Dockerfile
①FROM FROM <image> 或 FROM <image>:<tag> 必须是一个存在的镜像,基础镜像,必须是第一条非注释的指令
②MAINTAINER MAINTAINER <name> 指定镜像的作者信息,包含镜像的所有者和联系信息
③RUN 指定当前镜像中运行的命令
RUN <command> (shhell 模式)
/bin/sh -c command
RUN ["executable", "param1", "param2"] (exec模式)
RUN["/bin/bash", "-c", "echo hello"]
④EXPOSE EXPOSE <port> [<port>...] 指定运行该镜像的容器使用的端口
(3)其他指令
①CMD 容器运行时执行,区别于RUN指令(在镜像构建过程中)
CMD <command> param1 param2 (shhell 模式)
CMD ["executable", "param1", "param2"] (exec模式)
CMD ["param1", "param2"] (作为 ENTERYPOINT 指令的默认参数)
利用该Dockerfile构建镜像,如下
利用构建出的镜像启动一个容器
如果在运行容器时指定运行的命令如下,则会覆盖CMD指令中的命令,如下
②ENTERYPOINT ENTERYPOINT ["executable", "param1", "param2"] (exec模式)
ENTERYPOINT command param1 param2 (shell模式)
与CMD指令类似,不同的是:默认在容器启动时指定得命令不会覆盖dockerfile文件中ENTERYPOINT 指令;
如果需要覆盖,可以使用docker run --enterypoint 进行覆盖
③ADD ADD <src> ...<dest> 或者 ADD ["<src>"..."<dest>"](适用于文件路径中有空格的情况)
④COPY COPY <src> ...<dest> 或者 COPY ["<src>"..."<dest>"](适用于文件路径中有空格的情况)
ADD vs. COPY:
ADD 包含类似tar的解压功能;如果单纯复制文件,Docker推荐使用COPY指令
⑤VOLUME VOLUME ["/data"] 用于向 基于镜像构建的容器 添加卷
⑥WORKDIR 用于在基于镜像构建的容器中指定工作目录
WORKDIR /path/to/workdir 应该使用绝对路径,如果使用了相对路径,则路径会发生传递
比如 WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd 结果为 /a/b/c
⑦ENV 用于设置环境变量,与WORKDIR类似
ENV <key> <value> 或者 ENV <key>=<value>...
⑧USER 指定镜像会以什么样的用户去运行 USER daemon
如:USER nginx 基于该镜像启动的容器,就会以nginx用户的身份运行
也可以在USER指令中使用uid、 group、 gid,或者是这4种的组合使用,例如:
USER user USER user:group USER user:gid
USER uid USER uid:gid USER uid:group
⑨ONBUILD 用于为镜像添加触发器 ONBUILD [INSTRUCTION]
镜像触发器:当一个镜像被其他镜像作为基础镜像时执行,会在构建过程中插入指令
2、Dockerfile构建过程
(1)从基础镜像运行一个容器; 执行一条指令,对容器做出修改; 执行类似docker commit的操作,提交一个新的镜像层;
再基于刚提交的镜像运行一个新容器; 执行dockerfile中的下一条指令,直至所有指令执行完毕
![]() |
这样我们就可以利用这些中间层镜像进行调试
(2)构建缓存,例如:
如果不想使用缓存:docker build --no-cache
(3)查看镜像构建的过程: docker history [image]