gpt4 book ai didi

docker - 带有 webpack 的单体 docker 应用程序

转载 作者:行者123 更新时间:2023-12-02 11:36:57 25 4
gpt4 key购买 nike

我在 GKE 上的 docker 容器和 k8s 中运行我的单体应用程序。

该应用程序包含 python 和节点依赖项,还包含用于前端包的 webpack。

我们已经实现了 CI/CD,大约需要 5-6 分钟来构建和部署新版本到 k8s 集群。

主要目标是尽可能减少构建时间。书面 Dockerfile 是多阶段的。

Webpack 需要更多时间来生成捆绑包。要构建 docker 镜像,我正在使用已经很高的配置 worker 。

为了减少时间,我尝试使用 Kaniko builder .

问题 :

作为 python 代码的 docker 缓存层,它运行良好。但是当JS有任何变化时或 CSS文件我们必须生成包。

JS有任何变化时& CSS文件而不是如果生成新的包它使用缓存层。

有没有办法通过将一些值传递给 docker 文件来分离构建新包或使用缓存。

这是我的 docker 文件:

FROM python:3.5 AS python-build
WORKDIR /app
COPY requirements.txt ./
RUN pip install -r requirements.txt &&\
pip3 install Flask-JWT-Extended==3.20.0
ADD . /app

FROM node:10-alpine AS node-build
WORKDIR /app
COPY --from=python-build ./app/app/static/package.json app/static/
COPY --from=python-build ./app ./
WORKDIR /app/app/static
RUN npm cache verify && npm install && npm install -g --unsafe-perm node-sass && npm run sass && npm run build


FROM python:3.5-slim
COPY --from=python-build /root/.cache /root/.cache
WORKDIR /app
COPY --from=node-build ./app ./
RUN apt-get update -yq \
&& apt-get install curl -yq \
&& pip install -r requirements.txt
EXPOSE 9595
CMD python3 run.py

最佳答案

我建议为你的 docker 镜像创建单独的构建管道,你知道对 npm 和 pip 的要求不是那么频繁。
这将极大地提高速度,减少访问 npm 和 pip 注册表的时间。

使用私有(private) docker 注册表(official one 或类似 VMWare harborSonaType Nexus OSS )。

您将这些构建镜像存储在注册表中,并在项目发生更改时使用它们。

像这样的东西:

第一个 Docker 构建器 // python-builder:YOUR_TAG [gitrev、日期等)

docker build --no-cache -t python-builder:YOUR_TAG -f Dockerfile.python.build .

FROM python:3.5
WORKDIR /app
COPY requirements.txt ./
RUN pip install -r requirements.txt &&\
pip3 install Flask-JWT-Extended==3.20.0

第二个 Docker 构建器 // js-builder:YOUR_TAG [gitrev、日期等)
docker build --no-cache -t js-builder:YOUR_TAG -f Dockerfile.js.build .  

FROM node:10-alpine
WORKDIR /app
COPY app/static/package.json /app/app/static
WORKDIR /app/app/static
RUN npm cache verify && npm install && npm install -g --unsafe-perm node-sass

您的 应用程序多阶段构建 :
docker build --no-cache -t app_delivery:YOUR_TAG -f Dockerfile.app .  

FROM python-builder:YOUR_TAG as python-build
# Nothing, already "stoned" in another build process

FROM js-builder:YOUR_TAG AS node-build
ADD ##### YOUR JS/CSS files only here, required from npm! ###
RUN npm run sass && npm run build

FROM python:3.5-slim
COPY . /app # your original clean app
COPY --from=python-build #### only the files installed with the pip command
WORKDIR /app
COPY --from=node-build ##### Only the generated files from npm here! ###
RUN apt-get update -yq \
&& apt-get install curl -yq \
&& pip install -r requirements.txt
EXPOSE 9595
CMD python3 run.py

一个问题是:为什么要安装 curl并再次执行 pip install -r requirements.txt最终 docker 镜像中的命令?
每次触发 apt-get update并在不清理 apt 缓存的情况下安装 /var/cache/apt文件夹产生更大的图像。

作为建议,使用带有选项 的 docker build 命令。 --no-cache 避免缓存结果:
docker build --no-cache -t your_image:your_tag -f your_dockerfile .

备注 :

正如我在上面列出的,您将拥有 3 个单独的 Dockerfile。
构建 Docker 镜像 1 和 2 仅限 如果你改变你的 python-pipnode-npm要求,否则为您的项目保持固定。
如果任何依赖要求发生变化,则更新所涉及的 docker 镜像,然后更新多阶段镜像以指向最新构建的镜像。

您应该始终只构建项目的源代码(CSS、JS、python)。通过这种方式,您还保证了可重现的构建。

要优化您的环境并跨多阶段构建器复制文件,请尝试使用 virtualenv用于python构建。

关于docker - 带有 webpack 的单体 docker 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57883224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com