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-slim
COPY ./requirements.txt /code/
WORKDIR /code
RUN pip install requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
CMD [ "python3", "main.py" ]
(2) 构建镜像
cd /home/xxx/project_name
docker 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_name
git pull
docker restart project_name
4 go程序dockerfile
(1) 极简版
# 1 build为可执行文件
FROM golang:alpine AS builder
WORKDIR /build
COPY . .
RUN go build -o hello hello.go
# 2 在迷你的linux容器中运行
FROM alpine
WORKDIR /build
COPY --from=builder /build/hello /build/hello
CMD ["./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"]