别再手写python项目Dockerfile了

写在前面

你是不是那种觉得编写Dockerfiledocker-compose.yml文件很痛苦的人。至少我从来都不喜欢它们。

我总是在想,我在编写Dockerfiledocker-compose配置文件时有没有遵循最佳实践,并且要一再确定是否不知不觉地引入安全漏洞。

然而现在,这一切都结束了,Docker官方应用生成式 AI 创建了一个名为 docker init 的 CLI 实用工具。他免去了我编写Dockerfile的痛苦,一切都是那么的丝滑。

docker init 是什么

Docker 最近发布了docker init的正式版本。我已经在demo中做了测试,发现它非常有用,迫切地想在我的日常工作中使用它。

docker init是一个命令行实用工具,用于在项目中初始化 Docker 资源。它根据项目的需求创建DockerfileCompose文件和.dockerignore文件。

这简化了为项目配置 Docker 的过程,节省时间,降低复杂性。

docker init的最新版本支持 Go、Python、Node.js、Rust、ASP.NET、PHP 和 Java。它可以在 Docker Desktop 中使用。

如何使用 docker init?

使用 docker init 非常简单,只需几个简单的步骤。首先,进入你想要设置 Docker 资源的项目目录。

让我创建一个基本的 Flask 应用。这个应用只有一整个文件,并且不超过10行代码

touch app.py requirements.txt

将下面的代码复制到相应的文件中。

# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_docker():
    return '<h1> hello world </h1'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')
# requirements.txt
Flask

准备工作就绪,让我们来看看 docker init 的魔力

docker init将扫描你的项目,并要求你确认并选择最适合你的应用程序的模板。选择模板后,docker init会要求你提供一些项目特定的信息,自动生成项目所需的 Docker 资源。

docker init

别再手写python项目Dockerfile了

接下来要做的是选择应用程序平台,对于我们的示例,我们使用的是 Python。它会根据你的项目推荐一些配置值,如 Python 版本、端口、入口命令等。

别再手写python项目Dockerfile了

你可以选择默认值,也可以提供自己想要的值,它会即时创建你的 Docker 配置文件以及运行应用程序的指令。

别再手写python项目Dockerfile了

让我们看看这个自动生成的配置文件是什么样的。

Dockerfile 文件

# syntax=docker/dockerfile:1

# Comments are provided throughout this file to help you get started.
# If you need more help, visit the Dockerfile reference guide at
# https://docs.docker.com/engine/reference/builder/

ARG PYTHON_VERSION=3.11.7
FROM python:${PYTHON_VERSION}-slim as base

# Prevents Python from writing pyc files.
ENV PYTHONDONTWRITEBYTECODE=1

# Keeps Python from buffering stdout and stderr to avoid situations where
# the application crashes without emitting any logs due to buffering.
ENV PYTHONUNBUFFERED=1

WORKDIR /app

# Create a non-privileged user that the app will run under.
# See https://docs.docker.com/go/dockerfile-user-best-practices/
ARG UID=10001
RUN adduser 
    --disabled-password 
    --gecos "" 
    --home "/nonexistent" 
    --shell "/sbin/nologin" 
    --no-create-home 
    --uid "${UID}" 
    appuser

# Download dependencies as a separate step to take advantage of Docker's caching.
# Leverage a cache mount to /root/.cache/pip to speed up subsequent builds.
# Leverage a bind mount to requirements.txt to avoid having to copy them into
# into this layer.
RUN --mount=type=cache,target=/root/.cache/pip 
    --mount=type=bind,source=requirements.txt,target=requirements.txt 
    python -m pip install -r requirements.txt

# Switch to the non-privileged user to run the application.
USER appuser

# Copy the source code into the container.
COPY . .

# Expose the port that the application listens on.
EXPOSE 5000

# Run the application.
CMD gunicorn 'app:app' --bind=0.0.0.0:5000


看起来比我以前写的Dockerfile好多了。

compose.yaml

别再手写python项目Dockerfile了

它生成了应用程序的 Docker Compose 配置,因为我们的应用程序没有包含与数据库的连接,所以它将你可能需要的数据库容器的代码注释掉了。

如果你想在 Flask 应用中使用数据库,可以在 docker-compose 文件中取消注释 db 相关的配置。

写在最后

docker init 可以写出比绝大多数人更好的 Docker 配置,就像一个极客一样遵循最佳实践。


原文始发于微信公众号(harvey的网络日志):别再手写python项目Dockerfile了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/245929.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!