Dockerfile常用指令记录

来源:互联网 发布:如何改变网络的拥堵 编辑:程序博客网 时间:2024/05/21 13:16

FROM

格式为 FROM <image> 或 FROM<image>:<tag> 。

第一条指令必须为 FROM 指令。

并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)。

MAINTAINER

格式为 MAINTAINER <name> ,指定维护者信息。

COPY

格式为 COPY <src> <dest> 。

复制本地主机的 <src> (为Dockerfile所在目录的相对路径)到容器中的 <dest> 。

当使用本地目录为源目录时,推荐使用 COPY 。

ADD

格式为 ADD <src> <dest> 。

与 COPY 类似,从 build context 复制文件到镜像,  <src> 可以是Dockerfile所在目录的一个相对路径。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。

RUN

格式为 RUN <command> 或 RUN["executable", "param1", "param2"] 。

前者将在shell终端中运行命令,即 /bin/sh-c ;后者则使用 exec 执行。

指定使用其它终端可以通过第二种方式实现,例如 RUN["/bin/bash", "-c", "echo hello"] 。

每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。

当命令较长时可以使用 \ 来换行。

CMD

支持三种格式

CMD["executable","param1","param2"] 使用 exec 执行,推荐方式;

CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;

CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;

指定启动容器时执行的命令,每个Dockerfile只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。

如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

docker run -i -t myimage  /bin/bash //覆盖CMD中的命令 执行/bin/bash

ENV

格式为 ENV<key> <value> 。

指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。

例如ENV JAVA_HOME /usr/lib/jvm/default/jre

WORKDIR

格式为 WORKDIR /path/to/workdir 。

为后续的 RUN 、 CMD 、 ENTRYPOINT 指令配置工作目录。

可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

WORKDIR /home

WORKDIR admin

RUN pwd

则最终路径为 /home/admin

ENTRYPOINT

两种格式:

ENTRYPOINT ["executable","param1", "param2"]

ENTRYPOINT command param1 param2 (shell中执行)。

配置容器启动后执行的命令,并且不可被 dockerrun 提供的参数覆盖。

每个Dockerfile中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效。

EXPOSE

格式为 EXPOSE <port> [<port>...] 。

告诉Docker服务端容器暴露的端口号,供互联系统使用。eg:EXPOSE 80

VOLUME

格式为 VOLUME ["/data"] 。为容器添加一个数据卷

创建一个可以从挂载宿主机文件或目录到容器的挂载点,一般用来存放数据库和需要保持的数据等。

docker run --name data -v /opt/data -t -i docker.io/ubuntu /bin/bash
可以直接挂载宿主机文件或目录到容器里,可以理解为目录映射,这样就可以让所有的容器共享宿主机数据,从而只需要改变宿主机的数据源就能够影响到所有的容器数据。
-v 后面的映射关系是"宿主机文件/目录:容器里对应的文件/目录",其中,宿主机上的文件/目录是要提前存在的,容器里对应的文件/目录会自动创建。
docker run --name data -v /opt/data/demo.sh:/usr/server/demo.sh -t -i docker.io/ubuntu /bin/bash
数据卷权限:
挂载的数据默认为可读写权限。但也可以根据自己的需求,将容器里挂载共享的数据设置为只读,这样数据修改就只能在宿主机上操作。
docker run --name data -v /opt/data/demo.sh:/usr/server/demo.sh:ro -t -i docker.io/ubuntu /bin/bash

参考:Dockerfile常用指令

docker数据卷的使用

dockerfile做的事情其实就是拉镜像,镜像启容器,容器构建镜像,镜像再启容器,容器再转镜像,删除中间镜像和容器,大概就是这样的。