文章转自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 或者FROM :
用法
MAINTAINER <name>
CMD有三种使用方式:
CMD "executable","param1","param2"
CMD "param1","param2"
CMD command param1 param2 (shell form)
用法
EXPOSE [...]
例:docker container run -p 8000:3000 -it koa-demo /bin/bash
用来设置环境变量,常用的比如设置JDK变量
ENV # 只能设置一个变量
ENV = ... # 允许一次设置多个变量
这两个命令基本是一样的,唯一的不同就是COPY不能指定远程文件 URLS。
ADD ...
ENTRYPOINT "executable", "param1", "param2"
ENTRYPOINT command param1 param2 (shell form)
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 ["/data"]
创建一个可以从本地主机或其他容器挂载的挂载点,后续具体介绍。
USER daemon
WORKDIR /path/to/workdir
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
最终路径是/a/b/c。
WORKDIR指令可以在ENV设置变量之后调用环境变量:
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
最终路径则为 /path/$DIRNAME。