合理使用缓存
FROM python:3.9.13-slimRUN pip install -i https://mirrors.aliyun.com/pypi/simple/ flaskWORKDIR /src# 在linux 上设置 环境变量 FLASK=app.pyENV FLASK=app.pyCOPY app.py /src/app.py# 对外暴露端口用EXPOSE 5000CMD ["flask", "run", "-h", "0.0.0.0"]
对于经常需要改动的文件 可以尽可能将这行命令往后执行
因为构建的时候 运用到缓冲机制 可以更快的构建 但是一旦发生改动 改动的那一行往后都需要重新构建了
合理使用 .dockerignore
docker iamge build -t flask-demo .
如果当前文件中存在 多个无关文件存在 比如 env/ .vscode/
可以创建 .dockerignore 屏蔽 多余的文件
.vscode/env/
镜像的多阶段构建
c语言
FROM gcc:9.4 AS builderCOPY hello.c /src/hello.cWORKDIR /srcRUN gcc --static -o hello hello.cFROM alpine:3.13.5COPY --from=builder /src/hello /src/helloENTRYPOINT [ "/src/hello" ]CMD []# docker build -t hello-alpine -f Dockerfile .
#include <stdio.h>void main(int argc, char *argv[]){printf("1111\n");printf("%s %d\n", argv[0], argc);printf("hello %s\n", argv[argc - 1]);}
go语言
#源镜像FROM golang:latest AS builderCOPY main.go /src/main.go#设置工作目录WORKDIR /srcRUN go build ./main.goFROM alpine:3.13.5COPY --from=builder /src/main /src/mainENTRYPOINT [ "/src/main" ]CMD []# docker build -t hello-alpine-go -f Dockerfile .
package mainimport ("fmt""syscall")func main() {v, ok := syscall.Getenv("MYDATA")if ok {fmt.Printf("hello %s\n", v)} else {fmt.Printf("hello \n")}}// docker build -t hello-alpine-go -f Dockerfile .// docker container run --rm -e MYDATA=abc -it hello-alpine-go
尽量使用非root用户
如何使用非root用户
root用户
FROM python:3.9.5-slimRUN pip install flaskCOPY app.py /src/app.pyWORKDIR /srcENV FLASK_APP=app.pyEXPOSE 5000CMD ["flask", "run", "-h", "0.0.0.0"]
非 root用户
FROM python:3.9.5-slimRUN pip install flask && \groupadd -r flask && useradd -r -g flask flask && \mkdir /src && \chown -R flask:flask /srcUSER flaskCOPY app.py /src/app.pyWORKDIR /srcENV FLASK_APP=app.pyEXPOSE 5000CMD ["flask", "run", "-h", "0.0.0.0"]
from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world():return "Hello, Docker!"
