# Usage: FROM [image name]
FROM ubuntu
注: FROM scratch
这是Docker 种存在的特殊镜像 。这个镜像是虚拟的概念并不实际存在,表示一个空白的镜像。对于 Linux 下静态编译的程序,并不需要有操作系统提供运行支持,所需的一切库都已经在可执行文件里了,因此 FROM scratch 会让镜像体积更加小巧。 RUN 执行命令
RUN echo 'Hello, Docker!' > /usr/share/nginx/html/index.html
exec 格式:
RUN ["可执行文件", "参数1", "参数2"] ,这更像是函数调用中的格式。
Dockerfile 中每一个指令都会建立一层, RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后, commit 这一层的修改,构成新的镜像。
FROM debian:jessie
RUN apt-get update
RUN apt-get install -y gcc libc6-dev make
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz"
RUN mkdir -p /usr/src/redis
RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install
上面的这种写法,创建了 7 层镜像,这是完全没有意义的。结果就是产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。Union FS 是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过127 层
上面的 Dockerfile 正确的写法应该是这样:
# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo ENV
ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。
# Usage: ENV key value
ENV SERVER_WORKS 4 EXPOSE
EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。