dockerfile类似于Shell脚本,实际上只是一个用特定语法写出的普通文本文件,
作用: 在原生镜像的基础上定制 新镜像
1 Dockerfile语法
FROM: 指定基础镜像
RUN: 构建镜像过程中需要执行的命令。可以有多条。
CMD:添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改。
ADD:将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件 WORKDIR:切换目录, 相当于cd, 若目录不存在, 会自动创建
ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。
MLABELAINTAINER:表明镜像的作者。将被遗弃,被LABEL代替。
EXPOSE:设置对外暴露的端口。 ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效
ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失
COPY:将本地文件或目录拷贝到镜像的文件系统中。
VOLUME:添加数据卷, 会映射到docker自己管理的文件夹下(/var/lib/docker/volumes)
USER:指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令
ONBUILD:如果制作的镜像被另一个Dockerfile使用,将在那里被执行Docekrfile命令
STOPSIGNAL:设置容器退出时发出的关闭信号。
HEALTHCHECK:设置容器状态检查。
SHELL:更改执行shell命令的程序。Linux的默认shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]
2 docker build
docker build 命令用于使用 Dockerfile 创建镜像。
docker build [OPTIONS] PATH
OPTIONS说明:
—tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
-f :指定要使用的Dockerfile路径;
—network: 默认 default。在构建期间设置RUN指令的网络模式
—build-arg=[] :设置镜像创建时的变量;
—cpu-shares :设置 cpu 使用权重;
—cpu-period :限制 CPU CFS周期;
—cpu-quota :限制 CPU CFS配额;
—cpuset-cpus :指定使用的CPU id;
—cpuset-mems :指定使用的内存 id;
—disable-content-trust :忽略校验,默认开启;
—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配置。
—squash :将 Dockerfile 中所有的操作压缩为一层。
3 python程序dockerfile
(1) 编写dockerfile
FROM python:3.8-slimCOPY ./requirements.txt /code/WORKDIR /codeRUN pip install requirements.txt -i https://mirrors.aliyun.com/pypi/simple/CMD [ "python3", "main.py" ]
(2) 构建镜像
cd /home/xxx/project_namedocker build -t project_name .
(3) 运行容器
docker run -d --name project_name \-v /home/xxx/project_name:/code \--workdir /code \--network host \--privileged project_name
(4) 更新代码, 重启容器
cd /home/xxx/project_namegit pulldocker restart project_name
4 go程序dockerfile
(1) 极简版
# 1 build为可执行文件FROM golang:alpine AS builderWORKDIR /buildCOPY . .RUN go build -o hello hello.go# 2 在迷你的linux容器中运行FROM alpineWORKDIR /buildCOPY --from=builder /build/hello /build/helloCMD ["./hello"]
(2) 精简版
# 基础镜像,基于golang的alpine镜像构建--编译阶段FROM golang:alpine AS builder# 作者MAINTAINER scoful# 全局工作目录WORKDIR /go/kingProject# 把运行Dockerfile文件的当前目录所有文件复制到目标目录COPY . /go/kingProject# 环境变量# 用于代理下载go项目依赖的包ENV GOPROXY https://goproxy.cn,direct# 编译,关闭CGO,防止编译后的文件有动态链接,而alpine镜像里有些c库没有,直接没有文件的错误RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-w -s" main.go# 使用alpine这个轻量级镜像为基础镜像--运行阶段FROM alpine AS runner# 全局工作目录WORKDIR /go/kingProject# 复制编译阶段编译出来的运行文件到目标目录COPY --from=builder /go/kingProject/main .# 复制编译阶段里的config文件夹到目标目录COPY --from=builder /go/kingProject/config ./config# 将时区设置为东八区RUN echo "https://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories \&& echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories \&& apk add --no-cache tzdata \&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo Asia/Shanghai > /etc/timezone \&& apk del tzdata# 需暴露的端口EXPOSE 8888# 可外挂的目录VOLUME ["/go/kingProject/config","/go/kingProject/log"]# docker run命令触发的真实命令(相当于直接运行编译后的可运行文件)ENTRYPOINT ["./main"]
