Dockerfile指南

1.基础镜像的选择

  • 官方镜像优于非官方的镜像,如果没有官方镜像,则尽量选择Dockerfile开源的

  • 固定版本tag而不是每次都使用latest

  • 尽量选择体积小的镜像

2.通过 RUN 执行指令

每一行的RUN命令都会产生一层image layer, 导致镜像的臃肿,所以尽可能写到一个Run里。

//Bad
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y wget
RUN wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz
RUN tar zxf ipinfo_2.0.1_linux_amd64.tar.gz
RUN mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo
RUN rm -rf ipinfo_2.0.1_linux_amd64.tar.gz

//Good
FROM ubuntu:20.04
RUN apt-get update && \
    apt-get install -y wget && \
    wget https://github.com/ipinfo/cli/releases/download/ipinfo-2.0.1/ipinfo_2.0.1_linux_amd64.tar.gz && \
    tar zxf ipinfo_2.0.1_linux_amd64.tar.gz && \
    mv ipinfo_2.0.1_linux_amd64 /usr/bin/ipinfo && \
    rm -rf ipinfo_2.0.1_linux_amd64.tar.gz

docker image history ID //查看分层内存使用情况

3.文件的复制和目录操作

Copy和 ADD 都可以把local的一个文件复制到镜像里,如果目标目录不存在,则会自动创建

FROM python:3.9.5-alpine3.13
COPY hello.py /app/hello.py //完全复制 包括权限
ADD hello.py /app/hello.py //自动解压缩
WORKDIR /app  /如果没有app文件夹则创建并进入

4.构建参数和环境变量

ARG 和 ENV 是经常容易被混淆的两个Dockerfile的语法,都可以用来设置一个“变量”。ARG更注重build作用域更小。

FROM ubuntu:20.04
ENV/ARG VERSION=2.0.1
RUN apt-get update && \
    apt-get install -y wget && \
    wget https://github.com/ipinfo/cli/releases/download/ipinfo-${VERSION}/ipinfo_${VERSION}_linux_amd64.tar.gz && \
    tar zxf ipinfo_${VERSION}_linux_amd64.tar.gz && \
    mv ipinfo_${VERSION}_linux_amd64 /usr/bin/ipinfo && \
    rm -rf ipinfo_${VERSION}_linux_amd64.tar.gz

5.容器启动命令CMD和ENTRYPOINT

  • 容器启动时默认执行的命令

  • 如果定义了多个CMD,只有最后一个会被执行。

  • CMD 设置的命令,可以在docker container run 时传入其它命令,覆盖掉 CMD 的命令,但是 ENTRYPOINT 所设置的命令是一定会被执行的。

  • ENTRYPOINT 和 CMD 可以联合使用,ENTRYPOINT 设置执行的命令,CMD传递参数

FROM ubuntu:20.04

//Shell格式
ENTRYPOINT/CMD echo "hello docker"

ENV NAME=docker
CMD echo "hello $NAME" //打印hello docker

//Exec格式
ENTRYPOINT/CMD ["echo", "hello docker"]

ENV NAME=docker
CMD ["echo", "hello $NAME"]   //打印hello $NAME
CMD ["sh", "-c", "echo hello $NAME"]    //打印hello docker

6. Dockerfile 豆知识

  • 缓存使用:如果创建过的image再次创建会使用cache,如果其中有内容变动,从变动的那一行开始之后的内容将全都不使用cache,所以为了提高运行速度应该将不常变动的代码放在前面。

  • dockerignore:因为开始创建之前会将目标目录的文件全部上传,有以下两种方法提速:①创建新的文件夹②创建使用.dockerignore文件

    .vscode/
    env/
  • 多阶段构建当只需要使用编译环境编译一次,可以使用多阶段构建dockerfile,可以获得编译后的可执行文件。

    FROM gcc:9.4 AS builder
    
    COPY hello.c /src/hello.c
    
    WORKDIR /src
    
    RUN gcc --static -o hello hello.c
    
    
    
    FROM alpine:3.13.5
    
    COPY --from=builder /src/hello /src/hello
    
    ENTRYPOINT [ "/src/hello" ]
    
    CMD []
  • root诟病:假如我们有一个用户,叫demo,它本身不具有sudo的权限,所以就有很多文件无法进行读写操作,所以尽量不使用root。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值