写在前面
你是不是那种觉得编写Dockerfile
和docker-compose.yml
文件很痛苦的人。至少我从来都不喜欢它们。
我总是在想,我在编写Dockerfile
和docker-compose
配置文件时有没有遵循最佳实践,并且要一再确定是否不知不觉地引入安全漏洞。
然而现在,这一切都结束了,Docker官方应用生成式 AI 创建了一个名为 docker init 的 CLI 实用工具。他免去了我编写Dockerfile
的痛苦,一切都是那么的丝滑。
docker init 是什么
Docker 最近发布了docker init
的正式版本。我已经在demo中做了测试,发现它非常有用,迫切地想在我的日常工作中使用它。
docker init
是一个命令行实用工具,用于在项目中初始化 Docker 资源。它根据项目的需求创建Dockerfile
、Compose
文件和.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。它会根据你的项目推荐一些配置值,如 Python 版本、端口、入口命令等。
你可以选择默认值,也可以提供自己想要的值,它会即时创建你的 Docker 配置文件以及运行应用程序的指令。
让我们看看这个自动生成的配置文件是什么样的。
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
它生成了应用程序的 Docker Compose 配置,因为我们的应用程序没有包含与数据库的连接,所以它将你可能需要的数据库容器的代码注释掉了。
如果你想在 Flask 应用中使用数据库,可以在 docker-compose 文件中取消注释 db 相关的配置。
写在最后
docker init 可以写出比绝大多数人更好的 Docker 配置,就像一个极客一样遵循最佳实践。
原文始发于微信公众号(harvey的网络日志):别再手写python项目Dockerfile了
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/245929.html