docker容器中的Dockerfile文件命令记录

文章转自Docker学习笔记:Dockerfile

补充
对于一个 docker 镜像,我们可以这么来理解 ENTRYPOINT 与 CMD 的关系
如果没有定义 ENTRYPOINT, CMD 将作为它的 ENTRYPOINT
定义了 ENTRYPOINT 的话,CMD 只为 ENTRYPOINT 提供参数
容器运行的最终入口由 ENTRYPOINT 和实际的 CMD 拼接而成
注:ENTRYPOINT 同样可以被覆盖,如 docker run --entrypoint ls test -l /,将会执行 ls -l / 命令。


参考链接:
Dockerfile 中命令的两种书写方式的区别
每天五分钟玩转Docker

Docker 可以通过 Dockerfile 的内容来自动构建镜像。

Dockerfile 是一个包含创建镜像所有命令的文本文件,通过docker build命令可以根据 Dockerfile 的内容构建镜像,在介绍如何构建之前先介绍下 Dockerfile 的基本语法结构。

Dockerfile 有以下指令选项:

  • FROM
  • MAINTAINER
  • RUN
  • CMD
  • EXPOSE
  • ENV
  • ADD
  • COPY
  • ENTRYPOINT
  • VOLUME
  • USER
  • WORKDIR
  • ONBUILD
FROM命令

用法

FROM <image> 或者FROM <image>:<tag>
  • FROM指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来。
  • FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。
  • FROM可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像。
  • 如果FROM语句没有指定镜像标签,则默认使用latest标签。
MAINTAINER

用法

MAINTAINER <name>
  • 指定创建镜像的用户
CMD

CMD有三种使用方式:

CMD  "executable","param1","param2"
CMD  "param1","param2"
CMD command param1 param2 (shell form)
  • CMD指定在 Dockerfile 中只能使用一次,如果有多个,则只有最后一个会生效。
  • CMD的目的是为了在启动容器时提供一个默认的命令执行选项。如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。
  • CMD会在启动容器的时候执行,build 时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关了
EXPOSE

用法

EXPOSE <port> [<port>...]
  • 告诉 Docker 服务端容器对外映射的本地端口,需要在 docker run 的时候使用-p或者-P选项生效。

例:docker container run -p 8000:3000 -it koa-demo /bin/bash

ENV

用来设置环境变量,常用的比如设置JDK变量

ENV <key> <value>       # 只能设置一个变量
ENV <key>=<value> ...   # 允许一次设置多个变量
ADD 和 COPY

这两个命令基本是一样的,唯一的不同就是COPY不能指定远程文件 URLS。

ADD <src>... <dest>
  • ADD复制本地主机文件、目录或者远程文件 URLS 从 并且添加到容器指定路径中 。
  • 支持通过 Go 的正则模糊匹配
  • 路径必须是绝对路径,如果 不存在,会自动创建对应目录
  • 路径必须是 Dockerfile 所在路径的相对路径
  • 如果是一个目录,只会复制目录下的内容,而目录本身则不会被复制
ENTRYPOINT
ENTRYPOINT  "executable", "param1", "param2"
ENTRYPOINT command param1 param2 (shell form)
  • 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖,而CMD是可以被覆盖的。如果需要覆盖,则可以使用docker run –entrypoint选项。
  • 每个 Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效。

Exec form ENTRYPOINT 例子
通过ENTRYPOINT使用 exec form 方式设置稳定的默认命令和选项,而使用CMD添加默认之外经常被改动的选项。

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

通过 Dockerfile 使用ENTRYPOINT展示前台运行 Apache 服务

FROM debian:stable
RUN apt-get update && apt-get install -y --force-yes apache2
EXPOSE 80 443
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Shell form ENTRYPOINT 例子

这种方式会在/bin/sh -c中执行,会忽略任何CMD或者docker run命令行选项,为了确保docker stop能够停止长时间运行ENTRYPOINT的容器,确保执行的时候使用exec选项。

FROM ubuntu
ENTRYPOINT exec top -b
VOLUME
VOLUME ["/data"]

创建一个可以从本地主机或其他容器挂载的挂载点,后续具体介绍。

USER
USER daemon
  • 指定运行容器时的用户名或 UID,后续的RUN、CMD、ENTRYPOINT也会使用指定用户。
WORKDIR
WORKDIR /path/to/workdir
  • 为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

最终路径是/a/b/c。
WORKDIR指令可以在ENV设置变量之后调用环境变量:

ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME

最终路径则为 /path/$DIRNAME。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker ,一个已运行的容器是由一个镜像启动的,而镜像是由 Dockerfile 构建的。因此,一个已运行的容器并没有 Dockerfile,但是可以通过以下步骤找到镜像的 Dockerfile。 1. 查看容器的镜像 ID 首先,需要查看容器的镜像 ID。可以使用以下命令来列出所有正在运行的容器: ```bash docker ps ``` 然后,从输出结果找到目标容器的 ID。 2. 查看镜像的历史记录 接下来,需要查看容器所使用的镜像的历史记录。可以使用以下命令来列出镜像的历史记录: ```bash docker history <image ID> ``` 将 `<image ID>` 替换为容器的镜像 ID。 这个命令会输出镜像的历史记录,包括每一层的 ID、创建时间、创建者和指令。镜像的每一层都是由 Dockerfile 的一条指令构建的。 3. 定位 Dockerfile 根据镜像的历史记录,可以定位到创建镜像的 Dockerfile 的每一条指令。可以从镜像的最后一层开始,向上查找,找到第一条指令。这些指令的顺序和 Dockerfile 的顺序是相反的,因为 Dockerfile 是从上往下执行的,而镜像的历史记录是从下往上构建的。 通过这些指令,可以推断出 Dockerfile 的每一条指令。如果 Dockerfile 文件还存在于本地或者 Git 仓库,就可以直接查看 Dockerfile 文件。如果 Dockerfile 文件已经丢失,可以根据镜像的历史记录重新构建 Dockerfile 文件。 总之,虽然不能直接查询一个已运行的容器Dockerfile,但可以通过查询容器的镜像历史记录来推断 Dockerfile 的每一条指令,并根据需要重新构建 Dockerfile 文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值