Dockerfile使用技巧
原创大约 2 分钟
环境准备
待发布的app.py
文件。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
待优化的Dockerfile
文件。
FROM python:3.9.5-slim
COPY app.py /src/
RUN pip install flask
WORKDIR /src
ENV FLASK_APP=app.py
EXPOSE 5000
CMD ["flask", "run", "-h", "0.0.0.0"]
合理使用缓存
当第二次构建Dockerfile
时,Docker会输出如下内容。
=> CACHED [2/4] COPY app.py /src/
=> CACHED [3/4] RUN pip install flask
=> CACHED [4/4] WORKDIR /src
把经常发生改变的内容放到后面,不经常改变的放在前面。
合理使用.dockerignore
Docker的构建命令通常是这样的。
> docker build -t flask-demo .
其中的"."
称为build context
,它会把当前文件夹中的内容全部提交给Docker进行编译构建。
类似于.gitignore
文件,Docker也有.dockerignore
文件,它可以把不需要的文件排除掉,提高镜像构建的速度,减少镜像文件的大小。
镜像的多阶段构建
在同一个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用户
使用官方镜像库
在Github中搜索docker-library
开源项目,其中有大量官方镜像所使用的Dockerfile
,可以参考借鉴。
构建一个Python Flask镜像
有如下Python程序。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
其构建文件Dockerfile
如下。
FROM python:3.9.5-slim
# 这里/src后需要加上一个/,表示它是一个目录
COPY app.py /src/
RUN pip install flask
WORKDIR /src
ENV FLASK_APP=app.py
# 暴露5000端口访问
EXPOSE 5000
# 启动时执行"flask run”命令,并且将容器的host改为0.0.0.0,让它可以从外部访问
CMD ["flask", "run", "-h", "0.0.0.0"]
感谢支持
更多内容,请移步《超级个体》。