合理使用缓存

  1. FROM python:3.9.13-slim
  2. RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ flask
  3. WORKDIR /src
  4. # 在linux 上设置 环境变量 FLASK=app.py
  5. ENV FLASK=app.py
  6. COPY app.py /src/app.py
  7. # 对外暴露端口用
  8. EXPOSE 5000
  9. CMD ["flask", "run", "-h", "0.0.0.0"]

对于经常需要改动的文件 可以尽可能将这行命令往后执行

因为构建的时候 运用到缓冲机制 可以更快的构建 但是一旦发生改动 改动的那一行往后都需要重新构建了

合理使用 .dockerignore

  1. docker iamge build -t flask-demo .

如果当前文件中存在 多个无关文件存在 比如 env/ .vscode/

可以创建 .dockerignore 屏蔽 多余的文件

  1. .vscode/
  2. env/

镜像的多阶段构建

c语言

  1. FROM gcc:9.4 AS builder
  2. COPY hello.c /src/hello.c
  3. WORKDIR /src
  4. RUN gcc --static -o hello hello.c
  5. FROM alpine:3.13.5
  6. COPY --from=builder /src/hello /src/hello
  7. ENTRYPOINT [ "/src/hello" ]
  8. CMD []
  9. # docker build -t hello-alpine -f Dockerfile .
  1. #include <stdio.h>
  2. void main(int argc, char *argv[])
  3. {
  4. printf("1111\n");
  5. printf("%s %d\n", argv[0], argc);
  6. printf("hello %s\n", argv[argc - 1]);
  7. }

go语言

  1. #源镜像
  2. FROM golang:latest AS builder
  3. COPY main.go /src/main.go
  4. #设置工作目录
  5. WORKDIR /src
  6. RUN go build ./main.go
  7. FROM alpine:3.13.5
  8. COPY --from=builder /src/main /src/main
  9. ENTRYPOINT [ "/src/main" ]
  10. CMD []
  11. # docker build -t hello-alpine-go -f Dockerfile .
  1. package main
  2. import (
  3. "fmt"
  4. "syscall"
  5. )
  6. func main() {
  7. v, ok := syscall.Getenv("MYDATA")
  8. if ok {
  9. fmt.Printf("hello %s\n", v)
  10. } else {
  11. fmt.Printf("hello \n")
  12. }
  13. }
  14. // docker build -t hello-alpine-go -f Dockerfile .
  15. // docker container run --rm -e MYDATA=abc -it hello-alpine-go

尽量使用非root用户

如何使用非root用户

root用户

  1. FROM python:3.9.5-slim
  2. RUN pip install flask
  3. COPY app.py /src/app.py
  4. WORKDIR /src
  5. ENV FLASK_APP=app.py
  6. EXPOSE 5000
  7. CMD ["flask", "run", "-h", "0.0.0.0"]

非 root用户

  1. FROM python:3.9.5-slim
  2. RUN pip install flask && \
  3. groupadd -r flask && useradd -r -g flask flask && \
  4. mkdir /src && \
  5. chown -R flask:flask /src
  6. USER flask
  7. COPY app.py /src/app.py
  8. WORKDIR /src
  9. ENV FLASK_APP=app.py
  10. EXPOSE 5000
  11. CMD ["flask", "run", "-h", "0.0.0.0"]
  1. from flask import Flask
  2. app = Flask(__name__)
  3. @app.route('/')
  4. def hello_world():
  5. return "Hello, Docker!"