合理使用缓存
FROM python:3.9.13-slim
RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ flask
WORKDIR /src
# 在linux 上设置 环境变量 FLASK=app.py
ENV FLASK=app.py
COPY app.py /src/app.py
# 对外暴露端口用
EXPOSE 5000
CMD ["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 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 []
# 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 builder
COPY main.go /src/main.go
#设置工作目录
WORKDIR /src
RUN go build ./main.go
FROM alpine:3.13.5
COPY --from=builder /src/main /src/main
ENTRYPOINT [ "/src/main" ]
CMD []
# docker build -t hello-alpine-go -f Dockerfile .
package main
import (
"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-slim
RUN pip install flask
COPY app.py /src/app.py
WORKDIR /src
ENV FLASK_APP=app.py
EXPOSE 5000
CMD ["flask", "run", "-h", "0.0.0.0"]
非 root用户
FROM python:3.9.5-slim
RUN pip install flask && \
groupadd -r flask && useradd -r -g flask flask && \
mkdir /src && \
chown -R flask:flask /src
USER flask
COPY app.py /src/app.py
WORKDIR /src
ENV FLASK_APP=app.py
EXPOSE 5000
CMD ["flask", "run", "-h", "0.0.0.0"]
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return "Hello, Docker!"