如何将 VSCode 开发容器过渡到生产环境?

Wad*_*acy 13 docker visual-studio-code vscode-devcontainer

我是个新手,所以请耐心等待。我熟悉编写本地应用程序和脚本来自动执行我需要执行的管理任务,但现在我正在尝试熟悉 Gitlab CI/CD 流程。我一直在使用(并且喜欢)VSCode devcontainers,因为我陷入了学习 Python 虚拟环境并尝试管理不同 python 版本等的困境,而 devcontainers 让我所有的头痛都消失了。现在我试图弄清楚如何编写一个简单的应用程序(如 Flask 端点)并通过 Gitlab CI/CD 进行部署。

我目前陷入了如何将 devcontainer 的 VSCode Dockerfile 转换为生产就绪的 Dockerfile 的困境。例如,VSCode Dockerfile 使用了一个我认为在生产环境中无法接受的 VSCode 基础镜像。是否有为部署创建生产 Docker 配置的最佳实践?如果只是简单地创建一个单独的 Dockerfile,这是否违背了使用 Docker 容器进行开发的目的之一?您仍然会遇到“它在我的容器中工作正常......”的情况

Von*_*onC -1

是否有为部署创建生产 Docker 配置的最佳实践?

这些最佳实践之一可以是多阶段构建:它允许您将构建阶段(您可以在其中编译资产、安装依赖项等)与最终生产阶段分开,最终生产阶段仅包含运行应用程序所需的内容。该方法有助于减小最终图像的大小,并通过最小化攻击面来提高安全性。

  • 在第一阶段,您使用一个基础映像,其中包括编译和构建应用程序所需的所有工具和库。您安装依赖项、编译任何资产并准备您的应用程序。

  • 第二阶段从一个新的、轻量级的基础镜像开始。在这里,您仅复制构建阶段的必要工件。该阶段不包括用于构建的额外工具和库,从而使最终图像更小、更安全。

简单 Flask 应用程序的 Dockerfile 如下:

# Stage 1: Build Stage
FROM python:3.9 as builder

# Set the working directory
WORKDIR /usr/src/app

# Copy the requirements file
COPY requirements.txt .

# Install Python dependencies
RUN pip install --user -r requirements.txt

# Copy the Flask application
COPY . .

# You can perform any build steps here (e.g., compiling assets)

# Stage 2: Production Stage
FROM python:3.9-slim

# Set the working directory
WORKDIR /usr/src/app

# Copy only the dependencies
COPY --from=builder /root/.local /root/.local

# Copy the built application from the builder stage
COPY --from=builder /usr/src/app .

# Expose the port the app runs on
EXPOSE 5000

# Set environment variables
ENV PATH=/root/.local:$PATH

# Command to run the application
CMD ["python", "app.py"]
Run Code Online (Sandbox Code Playgroud)

最终映像仅包含您的应用程序及其运行时依赖项,而不包含整个构建环境。

您可以在 devcontainer 和 Dockerfile 的第一阶段中使用相同的基础映像。这确保了 Python 环境在开发和构建阶段的一致性。

并在两个环境中对依赖项使用相同requirements.txt或等效的配置。在开发过程中,您可能有其他特定于开发的包。