Docker Dockerfile 简明教程 [Docker 系列二]

流川凤 · 2018年08月31日 · 771 次阅读

之前我们提到,使用docker build 命令可以将 Dockerfile 生成镜像,Dockerfile 中的内容其实就是镜像生成的一个个步骤。

下面就是一个有效的 Dockerfile:

# 指定tomcat版本
FROM tomcat:8.5.32-jre8

# 指定工作目录
WORKDIR /app

# 将打包后的 server.jar 拷贝到镜像中
# 可以使用脉冲云的编译构建服务,在线将源码打包成 jar
ADD server.jar /app/server.jar

# 设置镜像的启动命令
CMD java -jar /app/server.jar

# 声明需要监听的端口
EXPOSE 8080

Dockerfile 中支持 # 开头的注释,然后就是一条条各种指令,下面我们一一了解下各种指令常用。

FROM

指定基础镜像,生成新镜像必须指定一个基础镜像,然后在此基础镜像上逐一运行随后的指令,最后生成新镜像,例如:

FROM ubuntu:16.04

RUN

在镜像内运行命令,注意,这是在镜像打包过程中运行的命令,不是启动容器后的命令。RUN 指令常常用来在镜像打包过程中安装软件,例如:

RUN apt-get update \
&& apt-get install nginx

可以使用转移符 \ 书写多行指令

RUN 其实调用的是标准的 shell,所以可以通过 && 连接执行多个命令

CMD

指定容器启动时执行的命令,注意,和 RUN 的区别是:RUN 是在打包过程中执行的命令。镜像中只能有一条 CMD 指令,如果有多个 CMD 指令,则以最后一条为准,所以我们可以覆盖基础镜像中定义的 CMD 指令。CMD 指令支持三种格式:

CMD ["executable", "param1", "param2"] 使用 exec 执行
CMD command param1 param2 使用/bin/sh -c执行
CMD ["param1", "param2"] 提供给ENTRYPOINT的默认参数

ENTRYPOINT

容器启动入口,即容器启动后执行的命令,不会被 CMD 指令覆盖,如果存在 ENTRYPOINT,那么 CMD 指令会充当 ENTRYPOINT 的参数。

ENTRYPOINT /app/entrypoint.sh

WORKDIR

指定后续 RUN、CMD、ENTRYPOINT 程序的工作目录,可以多次执行,就像 Linux 的 cd 命令。

WORKDIR /app
WORKDIR data
RUN pwd # /app/data

USER

指定后续 RUN、CMD、ENTRYPOINT 程序的用户名或 UID。

USER nginx

ENV

声明一个环境变量,可为后续的 RUN、CMD、ENTRYPOINT 程序所使用。

ENV JAVA_HOME /opt/java

EXPOSE

声明容器需要暴露的端口号。

EXPOSE 80 443

VOLUME

声明容器运行时的数据卷挂载点,将主机目录挂载到容器中,用来持久化保存容器生成的数据。

VOLUME /app/data

ADD

将 Dockerfile 所在目录中的文件拷贝到镜像中,ADD <src> <dest>,如果src 是一个 tar 包,那么会自动解压,并且src支持网络路径。

ADD server.jar /app/server.jar

COPY

和 ADD 类似,格式为 ·COPY ` ,复制本地文件到容器中,和 ADD 区别是,不会自动解压,推荐使用 COPY。

COPY server.jar /app/server.jar
COPY . /app
COPY dist/* /app/

文章分享转载自脉冲云,谢谢

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册