如何将python库从主机共享到多个docker容器?

2024-04-26 11:31:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个运行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容器


Tags: install方法dockerrunfromgitgetservice
1条回答
网友
1楼 · 发布于 2024-04-26 11:31:07

假设您可以将您的需求拆分为一个“公共”集合,以及一些附加的每个应用程序依赖项。在非Docker环境中,您可以运行:

python3 -m venv venv1
./venv1/bin/pip install ./requirements-common.txt
./venv1/bin/pip install ./some_repo_1/requirements.txt
./venv1/bin/uvicorn ...
# and similarly for venv2, some_repo_2

您可以构建自己的中间Docker映像,该映像只包含公共库:

FROM python:3.8.5-slim
WORKDIR /app
COPY requirements-common.txt .
RUN pip install -r requirements-common.txt
docker build -t my/app-base .

然后,当您构建每个应用程序映像时,可以将其作为基础映像,并预先安装该库集。按照Docker分层的工作方式,底层库集将在各种派生图像中共享

FROM my/app-base
# Inherits WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 81
CMD ["uvicorn", "main:app", " host", "0.0.0.0", " port", "81"]

Compose对此模式没有任何特定支持。如果中间映像仅由一组很少更改的预安装库组成,那么根据需要手动docker build它可能是最容易的,并按原样使用您在问题中遇到的docker-compose.yml

相关问题 更多 >