6、Dockerfile 文件
6.1 Dockerfile 简介
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),
每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
6.2 Dockerfile 基本语法
FROM 指令:FROM指定基础镜像
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。
就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,
基础镜像是必须指定的。而 FROM 就是指定 基础镜像,
因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
RUN指令:RUN指令是用来执行命令行命令的。RUN 指令在定制镜像时是最常用的指令之一。
其格式有两种:shell格式和exec格式
shell格式RUN指令如下:
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exec格式RUN指令如下:
FROM debian:stretch
RUN apt-get update
RUN apt-get install -y gcc libc6-dev make wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.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
6.3 Dockerfile 构建镜像
# 在Dockerfile 文件目录执行,实例:
$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM nginx
---> e43d811ce2f4
Step 2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
---> Running in 9cdc27646c7b
---> 44aa4490ce2c
Removing intermediate container 9cdc27646c7b
Successfully built 44aa4490ce2c
# 以上示例中我们使用了 docker build 命令对镜像进行构建
6.4 Dockerfile 构建镜像地注意点
构建Dockerfile镜像的时候会看到上面docker build 最后面有个点。
. 表示当前目录,但是这个当前目录不是指的操作者现在所在的这个当前目录,
而是指的是上下文的这目录。那么什么是上下文。下面看一下官方给的上下文例子。
如果在 Dockerfile 中这么写:
COPY ./package.json /app/
这并不是要复制执行 docker build 命令所在的目录下的 package.json,
也不是复制 Dockerfile 所在目录下的 package.json,而是复制 上下文(context)
目录下的 package.json。
因此,COPY 这类指令中的源文件的路径都是相对路径。
这也是初学者经常会问的为什么 COPY ../package.json /app 或者 COPY /opt/xxxx /app
无法工作的原因,因为这些路径已经超出了上下文的范围,Docker 引擎无法获得这些位置的文件。
如果真的需要那些文件,应该将它们复制到上下文目录中去。
现在就可以理解刚才的命令 docker build -t nginx:v3 . 中的这个 .,实际上是在指定上下文的目录,
docker build 命令会将该目录下的内容打包交给 Docker 引擎以帮助构建镜像。
如果观察 docker build 输出,我们其实已经看到了这个发送上下文的过程:
$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
6.5 docker build 的其他用法
# 直接用git仓库进行构建 (可以看出docker build 支持从URL构建)
docker build -t hello-world https://github.com/docker-library/hello-world.git#master:amd64/hello-world
# 用给定的压缩包构建
docker build http://server/context.tar.gz
如果所给出的 URL 不是个 Git repo,而是个 tar 压缩包,那么 Docker 引擎会下载这个包,
并自动解压缩,以其作为上下文,开始构建。
6.6 Dockerfile 指令详解
# COPY 指令 (复制文件)
# COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的<目标路径> 位置
COPY package.json /usr/src/app/
# ADD 指令 更高级的复制文件(如果不需要解压文件就可以使用ADD指令)
# ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz
# CMD 容器启动命令
CMD 指令的格式和 RUN 相似,也是两种格式:shell格式和exec格式。
Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,
需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。
shell 格式:CMD <命令>
exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数
本文暂时没有评论,来添加一个吧(●'◡'●)