请立刻停止编写 Dockerfiles 并使用 docker init
您是那种认为编写 Dockerfile 和 docker-compose.yml 文件很苦楚的人之一吗? 我承认,我就是其中之一。 我总是想知道我是否遵守了 Dockerfile、 docker-c…
您是那种认为编写 Dockerfile 和 docker-compose.yml 文件很苦楚的人之一吗?
我承认,我就是其中之一。
我总是想知道我是否遵守了 Dockerfile、 docker-compose 文件的最佳编写实践,我畏惧在不知不觉中引入了安全破绽。
但是现在,我不必再担忧这个问题了,感激 Docker 的优良开发人员,他们联合了生成式人工智能,创立了一个 CLI 适用工具 — docker init。
介绍 docker init
前段时光,Docker 推出了 docker init 的通用版本。我已经尝试过,发现它非常有用,迫不及待地想在日常生涯中应用它。
什么是 docker init?
docker init 是一个命令行运用程序,可赞助初始化项目中的 Docker 资源。它依据项目标请求创立 Dockerfiles、docker-compose 文件和 .dockerignore 文件。
这简化了为项目配置 Docker 的进程,节俭时光并下降庞杂性。
最新版本的 docker init 支撑 Go、Python、Node.js、Rust、ASP.NET、PHP 和 Java。目前它只能于 Docker Desktop 一起应用,也就是说大家目前在 Linux 体系中是无法应用 docker init 的。
如何应用 docker init?
应用 docker init 很简略,只需几个简略的步骤。首先,转到您要在其中设置 Docker 资源的项目目录。
举个例子,我来创立一个根本的 Flask 运用程序。
1、创立 app.py 以及 requirements.txt
touch app.py requirements.txt
将以下代码复制到相应文件中
# app.py
from flask import Flask
app = Flask(__name__)
def hello_docker():
return '<h1> hello world </h1'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
# requirements.txt
Flask
2、应用 docker init 初始化
docker init 将扫描您的项目并请求您确认并选择最合适您的运用程序的模板。选择模板后,docker init 会请求您供给一些特定于项目标信息,主动为您的项目生成必要的 Docker 资源。
现在让我们来履行 docker init。
docker init
涌现如下成果,
接下来要做的就是选择运用程序平台,在我们的示例中,我们应用 python。它将建议您的项目标推举值,例如 Python 版本、端口、入口点命令。
您可以选择默认值或供给所需的值,它将创立您的 docker 配置文件以及动态运行运用程序的解释。
让我们来看看这个主动生成的配置是什么样子。
3、生成 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。
它遵守人们在所有 Linkedin 和 Medium 帖子中不断告知我们的所有性能和安全最佳实践。
docker-compose.yml
它编写了 docker-compose 配置来运行运用程序。由于我们的运用程序不包括与数据库的任何衔接,因此它注释掉了数据库容器可能须要的代码。
如果您想在 Flask 运用程序中应用数据库,请从 docker-compose 文件中撤消注释 db 服务配置,创立一个包括秘密的本地文件,然后运行该运用程序。它还为我们生成了 .dockerignore 文件。
为什么应用 docker init?
docker init 使 Docker 化变得轻而易举,特殊是对于 Docker 新手来说。它清除了编写 Dockerfile 和其他配置文件的手动义务,从而节俭时光并最大限度地减少毛病。
它应用模板依据您的运用程序类型自定义 Docker 设置,同时遵守行业最佳实践。
总结一下
总而言之,docker init 完成了上面这一切。
它可以编写比 90% 的孩子更好的 Docker 配置。
像书呆子一样遵守最佳实践。
当安全人员的工具生成包括数百个您从未想过存在的破绽的报告时,可以节俭时光、精神和来自安全人员的讥讽评论。
最后须要解释的是,就像任何其他基于人工智能的工具一样,这个工具也不完善。不要盲目信任它生成的配置。我建议您在应用配置之前再次检讨下配置。