【发布时间】:2021-07-11 10:19:26
【问题描述】:
我们设置了多个运行 python 微服务的 docker 容器。问题是许多库在容器中是多余的。由于 docker 隔离,所有的库都独立安装在每个容器中,这增加了 docker 镜像的大小。
那么,有没有一种方法可以通过将所有库安装在共享文件夹或任何其他解决方案中来跨多个容器共享 python 库,保持代码仍然隔离但允许使用共享库?
Dockerfile1:
FROM python:3.8.5-slim
RUN apt-get update && \
apt-get install -y \
git openssh-server
# Avoid cache purge by adding requirements first
RUN git clone git@github.com:some_org/some_repo_1.git
WORKDIR ./some_repo_1/
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt
EXPOSE 80
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
Dockerfile2:
FROM python:3.8.5-slim
RUN apt-get update && \
apt-get install -y \
git openssh-server
# Avoid cache purge by adding requirements first
RUN git clone git@github.com:some_org/some_repo_2.git
WORKDIR ./some_repo_2/
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt
EXPOSE 81
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "81"]
docker-compose.yml
version: "3.9"
services:
service_1:
build:
context: './some_repo_1/'
ports:
- '80:80'
service_2:
build:
context: './some_repo_2/'
ports:
- '81:81'
注意:我们必须部署许多不同的微服务 docker 容器,它们的依赖关系有些相似。所以 docker 镜像大小是一个主要问题。
PS:我正在使用 docker-compose 来运行多个 docker 容器。
【问题讨论】:
-
这听起来你不应该首先使用 docker。但是,一个解决方案可能是将您需要的核心库放在一个文件夹中,您将通过卷选项在容器之间共享该库。
-
听起来您应该只创建一个包含所有依赖项的基础映像,然后在此基础上构建您的服务映像。
-
@Dimitar 我已经尝试过使用volumes 选项,但我无法在其他容器中获取python venv。我明白你不使用 docker 的意思,但问题陈述要求我隔离代码。
-
@larsks 创建基本映像后,我必须在此映像上克隆一个 git 存储库,这些存储库是所有容器上的单独存储库。所以这会产生一个大小相同的重复图像。
-
你能分享你正在使用的两个 Dockerfile 吗?
标签: python docker docker-compose pip microservices