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 创建镜像。

  1. 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

  1. FROM python:3.8-slim
  2. COPY ./requirements.txt /code/
  3. WORKDIR /code
  4. RUN pip install requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
  5. CMD [ "python3", "main.py" ]

(2) 构建镜像

  1. cd /home/xxx/project_name
  2. docker build -t project_name .

(3) 运行容器

  1. docker run -d --name project_name \
  2. -v /home/xxx/project_name:/code \
  3. --workdir /code \
  4. --network host \
  5. --privileged project_name

(4) 更新代码, 重启容器

  1. cd /home/xxx/project_name
  2. git pull
  3. docker restart project_name

4 go程序dockerfile

(1) 极简版

  1. # 1 build为可执行文件
  2. FROM golang:alpine AS builder
  3. WORKDIR /build
  4. COPY . .
  5. RUN go build -o hello hello.go
  6. # 2 在迷你的linux容器中运行
  7. FROM alpine
  8. WORKDIR /build
  9. COPY --from=builder /build/hello /build/hello
  10. CMD ["./hello"]

(2) 精简版

  1. # 基础镜像,基于golang的alpine镜像构建--编译阶段
  2. FROM golang:alpine AS builder
  3. # 作者
  4. MAINTAINER scoful
  5. # 全局工作目录
  6. WORKDIR /go/kingProject
  7. # 把运行Dockerfile文件的当前目录所有文件复制到目标目录
  8. COPY . /go/kingProject
  9. # 环境变量
  10. # 用于代理下载go项目依赖的包
  11. ENV GOPROXY https://goproxy.cn,direct
  12. # 编译,关闭CGO,防止编译后的文件有动态链接,而alpine镜像里有些c库没有,直接没有文件的错误
  13. RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-w -s" main.go
  14. # 使用alpine这个轻量级镜像为基础镜像--运行阶段
  15. FROM alpine AS runner
  16. # 全局工作目录
  17. WORKDIR /go/kingProject
  18. # 复制编译阶段编译出来的运行文件到目标目录
  19. COPY --from=builder /go/kingProject/main .
  20. # 复制编译阶段里的config文件夹到目标目录
  21. COPY --from=builder /go/kingProject/config ./config
  22. # 将时区设置为东八区
  23. RUN echo "https://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories \
  24. && echo "https://mirrors.aliyun.com/alpine/v3.8/community/" >> /etc/apk/repositories \
  25. && apk add --no-cache tzdata \
  26. && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  27. && echo Asia/Shanghai > /etc/timezone \
  28. && apk del tzdata
  29. # 需暴露的端口
  30. EXPOSE 8888
  31. # 可外挂的目录
  32. VOLUME ["/go/kingProject/config","/go/kingProject/log"]
  33. # docker run命令触发的真实命令(相当于直接运行编译后的可运行文件)
  34. ENTRYPOINT ["./main"]