基础 - 使用 Dockerfile 来定制镜像
FROM 指定基础镜像
一般我们定制镜像是从官方镜像中找到一些高质量的服务类/语言类/操作系统镜像定制我们自己想要的功能 如:nginx, redis, mongo, mysql, php, tomcat; node, python, ruby, golang; ubuntu, centos, alpine 等
e.g.: FROM nginx
如果想从第一层开始自己建立,使用空白镜像:FROM scratch
RUN 执行命令
RUN 指令时用来执行命令的,有两种格式:
- shell 格式
RUN <命令> - exec 格式
RUN ["可执行文件", "options"]
e.g.:
sh
$ 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每 RUN 一次,就会建立一层,上面的例子创建了 7 层镜像,docker 的层数是有限制的,上面的例子可以改写为:
sh
FROM debian:stretch
RUN set -x; buildDeps='gcc libc6-dev make wget' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDepsbuild | 构建镜像
在 Dockerfile 所在的文件目录执行:docker build [options] <上下文路径/URL/->
镜像构建上下文
上下文路径:在将本地文件复制进镜像时,告诉 docker 服务端用到的内容路径,e.g.:
docker
COPY ./package.json /app/打包时,一般将 dockerfile 空目录下/项目根目录下。如果该目录下没有所需的文件,应该复制一份过来
不需要的打包的文件,可以通过 .dockerignore 来定义
构建方式
除了从文件目录进行构建,还支持多种构建方式:
- 从
GIT repo - 从
tar压缩包 - 从标准输入中
sh
$ docker build -t hello-world https://github.com/docker-library/hello-world.git#master:amd64/hello-world
$ docker build http://server/context.tar.gz
cat Dockerfile | docker build -
$ docker build - < context.tar.gz