dockerfile 粗解

docker file 指令

指令 说明 语法 示例 个人理解
FROM 指定创建镜像的基础镜像。第一条指令必须是FROM FROM : or : FROM ubuntu:16.04 添加基础镜像信息
MAINTAINER 指定维护着的信息 MAINTAINER MAINTAINER 383595196@qq.com 报上大名
RUN 运行命令 RUN RUN apt-get update && apt-get install -y openssl libssl-dev git curl 执行命令添加基础包
CMD 指定启动容器时,默认执行的命令(一个dockerfile 只有一个CMD) CMD ["executable", "param1", "param2"] 1 执行在RUN之前 2 用户启动容器时手动指定了运行的命令(作为run的参数),则会覆 盖掉CMD指定的命令。
LABEL 指定生成镜像的标签信息 LABEL key=value 添加metadata数据
EXPOSE 声明镜像内服务所监听的端口 EXPOSE [] EXPOSE 22 80 8443 告诉Docker服务器容器暴露的湍口。启动时需要通过 -P,Docker 主机自动分配一个端口转发到指定的端口;使用-P,则可以具体指定那个本地端口映射。
ENV 指定环境变量 ENV ENV PG_MAJOR 9.3 指定环境变量,后续RUN指令使用,并在容器运行时保持。
ADD 复制指定 --> src 可以为 URL 如果是tar文件自动解压缩 ADD 复制本地主机的 为容器中的 。src in (文件, 文件夹, url, tar)
COPY 复制本机 --> 推荐使用 COPY COPY 复制本地主机 到容器中。目标路径不存在,会自动创建。
ENTRYPOINT 指定镜像默认入口 ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 详见以下解析
VOLUME 创建数据挂载点 VOLUME ["/data"] 创建一个可以本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
USER 指定运行容器时的用户名或uuid USER daemon RUN groupadd -r postgres && useradd -r -g postgres postgres 指定运行容器的用户名或UID,后续的RUN也会使用指定用户。要临时获取管理员权限可以使用gosu,而不推荐sudo。
WORKDIR 配置工作目录 WORKDIR /path/to/workdir 为后续的RUN CMD ENTRYPOINT配置工作目录。可以使用多个WORKDIR 如果后续命令是相对路径,会拼接。
ARG 指定镜像内使用的参数 ARG key=value FROM 之前指定只在在from 之前用,FROM 之后需要重新指定。可以构建容器时使用 --build-arg key=value 替换参数
ONBUILD 配置当前创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令 ONBUILD 配置所建镜像为其他镜像的基础镜像,则会执行ONBUILD 命令
STOPSIGNAL 容器退出信号值 目的是为了让容器内的应用程序在接收到signal之后可以先做一些事情,实现容器的平滑退出。
HEALTHCHECK 健康检查 FROM nginx RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* HEALTHCHECK --interval=5s --timeout=3s CMD curl -fs http://localhost/ exit 1 容器健康检查 例子来子这个小哥 https://yeasy.gitbook.io/docker_practice/image/dockerfile/healthcheck
SHELL 指定使用shell时的默认shell类型 SHELL ["/bin/sh", "-c"]

RUN vs CMD vs ENTRYPOINT

RUN 就是添加基础包用的, 可以创建多个。

添加基础包

RUN apt-get update && apt-get install -y openssl libssl-dev git curl

apt-get update 和 apt-get install 在单个 RUN 指令中执行。 这样做是为了确保安装最新的软件包。 如果 apt-get install 位于单独的 RUN 指令中,那么它将重用 apt-get update 添加的层,该层可能是很久以前创建的。

CMD 添加默认执行参数,并且 docker run 后如果跟着命令,则 CMD命令被覆盖

CMD echo "Hello world"

运行 docker run -it [image]

输出

Hello world

docker run -it [image] /bin/bash

则被覆盖不执行

只执行 /bin/bash

ENTRYPOINT

ENTRYPOINT 用于设置容器启动时要执行的命令及其参数,不同于CMD他的参数是一定执行的

ENTRYPOINT ["/bin/echo", "Hello"]

运行 docker run -it [image]

输出

Hello

运行 docker run -it [image] doudou

Hello doudou

修改 dockerfile

ENTRYPOINT ["/bin/echo", "Hello"]

CMD ["World"]

运行 docker run -it [image]

输出

Hello World

运行 docker run -it [image] doudou

Hello doudou

Docker RUN vs CMD vs ENTRYPOINT

以上观点来自这位老兄

https://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/

USER 的解析

https://blog.csdn.net/boling_cavalry/article/details/93380447

posted @ 2021-08-09 23:31  孤舟勇进  阅读(37)  评论(0)    收藏  举报