保留字 | 作用 |
---|---|
FROM | 当前镜像是基于哪个镜像 |
RUN | 构建镜像时需要需要运行的指令 |
EXPOSE | 当前容器对外暴露的端口号 |
WORKDIR | 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点 |
ENV | 用来在构建镜像过程中设置环境变量 |
ADD | 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包 |
COPY | 类似于ADD,拷贝文件和命令到镜像中 将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置 |
VOLUME | 容器数据卷,用于数据保存和持久化工作 |
CMD | 指定一个容器启动时要运行的命令 Dockerfile中可以有多个CMD命令,但只有最后一个生效,CMD会被docker run 之后的参数替换 |
ENTRYPOINT | 指定一个容器启动时要运行的命令 ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及其参数 |
基于哪个镜像进行构建的镜像,在构建时会自动从 docker hub
拉取base镜像,From 必须作为 Dockerfile 的第一个指令出现。
语法如下:
FROM
FROM [:] //使用版本不写则为latest
FROM [@] //使用摘要
RUN 命令将在当前映像之上的新层中执行任意命令并提交结果,生成的提交映像将用于 Dockerfile 中的下一步。
语法如下:
RUN (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
RUN ["executable", "param1", "param2"] (exec form)
RUN /bin/bash -c 'source $HOME/.bashrc && echo $HOME'
RUN ["/bin/bash", "-c", "echo hello"]
用来指定构建的镜像在运行为容器时对外暴露的端口。
语法如下:
EXPOSE 80/tcp #如果没有显示指定则默认暴露都是tcp
EXPOSE 80/udp
用来为启动的容器指定执行的命令,在 Dockerfile 中只能有一条 CMD
指令。如果列出多个命令,则只有最后一个命令生效。
语法如下:
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
例子:
指定一个容器启动时要运行的命令ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及其参数。
语法如下:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
用来为 Dockerfile 中的任何 RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。
语法如下:
#使用绝对路径
WORKDIR /path/to/workdir
#先使用绝对路径,再使用相对路径
WORKDIR /a
WORKDIR b
WORKDIR c
# /a/b/c
RUN pwd
ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
用来为构建镜像设置环境变量,这个值将出现在构建阶段中所有后续指令的环境中。
语法如下:
ENV
ENV =
用来从 context(上下文) 上下文复制新文件,目录或远程文件 url ,并将它们添加到位于指定路径的镜像文件系统中。
语法如下:
ADD hom* /mydir/
ADD hom?.txt /mydir/
ADD test.txt relativeDir/
ADD test.txt /absoluteDir/
ADD url
用来将 context(上下文) 目录中指定文件复制到镜像的指定目录中。
语法如下:
COPY hom* /mydir/
COPY hom?.txt /mydir/
COPY test.txt relativeDir/
COPY test.txt /absoluteDir/
ADD和COPY都能够将宿主机的文件添加到容器当中,但是ADD还有一个更强大的功能,ADD后面还能够接url参数,就是说ADD可以联网下载你url指定的文件,而COPY仅仅只能添加上下文目录中的文件。
docker run image:version 覆盖自己定义命令
docker run --entrypoint=覆盖指令 image:version 传递参数
我们创建的镜像一般不会让其他人看到镜像的内部构造,所以我们应该固定一个指令,参数随意。这样就应该让 CMD 和 ENTRYPOINT 结合使用。
注意:配合使用时必须使用json数组语法
一个简单的 Dockerfile 示例:
#指定基础镜像
FROM java:8-apline
#设置环境变量
ENV APP_PATH=/app
#设置工作目录
WORKDIR $APP_PATH
#将jar包导入新的镜像
ADD demo.jar $APP_PATH/apps.jar
#暴露端口
EXPOSE 8989
ENTRYPOINT ["java","-jar"]
CMD ["apps.jar"]
编写完之后,在 Dockerfile 文件目录下执行以下命令:
docker build -t apps:1.0 .
运行容器:
docker run -p 8989:8989 apps:1.0