简介
dockerfile是用来构建镜像的一种方法。通过Dockerfile文件,根据对应的规则构建镜像,其中Dockerfile文件记录了镜像构建的所有步骤。
官方文档
https://docs.docker.com/engine/reference/builder/#usage
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
常用配置说明
## 拉取基础镜像
FROM hub.c.163.com/library/java:8-jdk
## 镜像的作者
MAINTAINER csp@xxx.com
## 挂载目录,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的,可以使用docker volume ls 查看。
VOLUME ["/data1","/data2"]
## 命令执行
RUN ["mkdir", "-p", "/app"]
## 结合maven插件dockerfile-maven-plugin的打包使用
ARG JAR_FILE
ADD ${JAR_FILE} /app/app.jar
#为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。
#WORKDIR /usr/local/docker/test
#拷贝当前目录文件到容器/app
#COPY . /app
#与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。
#ADD src dest
#设置环境变量,环境变量可被后面的指令使用
ENV EVN_SET_TEST "WELCOME TO DOCKERFILE CONTAINER!'
##################
# RUN、CDM、ENTRYPOINT 命令都包含两种格式:Shell 格式和 Exec 格式
# CMD还可以放在ENTRYPOINT后,为其传递参数。
##### shell 格式:######
## 底层会调用 /bin/sh -c <command>
# 在容器中运行指定的命令
RUN echo $EVN_SET_TEST
# 容器启动命令 只有最后一个生效,CMD 可以被 docker run 之后的参数替换。
#只有最后一个生效
CMD echo "CMD Hello world"
#配置容器启动时运行的命令
ENTRYPOINT echo "ENTRYPOINT Hello, $EVN_SET_TEST"
###### Exec 格式: #####
## 当指令执行时,会直接调用 <command>,不会被 shell 解析
# ENTRYPOINT ["/bin/echo", "Hello, $EVN_SET_TEST"]
# 正确写法应该为:
# ENTRYPOINT ["/bin/sh", "-c", "echo Hello, $EVN_SET_TEST"]
# 为Exec 格式的ENTRYPOINT传递参数,结果输出Hello, $EVN_SET_TEST dockerfile world
# CMD ["dockerfile world"]
#只有最后一个生效
ENTRYPOINT ["java","-jar","/app/app.jar"]
#表示哪个端口提供服务的提示,宿主机如果要访问,需要结合-P参数联合使用。
EXPOSE 8080
创建镜像
- [x] docker build 命令用于使用 Dockerfile 创建镜像。
[root@node191 docker]# docker build --help
Usage: docker build [OPTIONS] PATH | URL | -
Build an image from a Dockerfile
Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
--build-arg list Set build-time variables
--cache-from strings Images to consider as cache sources
--cgroup-parent string Optional parent cgroup for the container
--compress Compress the build context using gzip
--cpu-period int Limit the CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit the CPU CFS (Completely Fair Scheduler) quota
-c, --cpu-shares int CPU shares (relative weight)
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
--disable-content-trust Skip image verification (default true)
-f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile')
--force-rm Always remove intermediate containers
--iidfile string Write the image ID to the file
--isolation string Container isolation technology
--label list Set metadata for an image
-m, --memory bytes Memory limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--network string Set the networking mode for the RUN instructions during build (default "default")
--no-cache Do not use cache when building the image
--pull Always attempt to pull a newer version of the image
-q, --quiet Suppress the build output and print image ID on success
--rm Remove intermediate containers after a successful build (default true)
--security-opt strings Security options
--shm-size bytes Size of /dev/shm
-t, --tag list Name and optionally a tag in the 'name:tag' format
--target string Set the target build stage to build.
--ulimit ulimit Ulimit options (default [])
- [x] 样例:
- 使用当前目录的 Dockerfile 创建镜像,标签为 hub.c.163.com/muxiyue/logstash:latest。
docker build -t hub.c.163.com/muxiyue/logstash:latest .
## 语法
docker build [OPTIONS] PATH | URL | -
## OPTIONS说明:
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
--quiet, -q :安静模式,成功后只输出镜像 ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
--network: 默认 default。在构建期间设置RUN指令的网络模式