在不同的docker容器之间共享python中的变量

Posted

技术标签:

【中文标题】在不同的docker容器之间共享python中的变量【英文标题】:Share variables in python between different docker containers 【发布时间】:2020-03-05 17:11:56 【问题描述】:

我有一个在 docker 容器中运行的 python 应用程序。在我的应用程序中,我正在缓存一些对象,因为它们的创建时间太大而无法在每次使用它们时创建它们。我现在想生成相同图像的多个容器来处理可能的负载。该应用程序实际上是一个提供 API 的网络服务器。但是,每个容器的缓存对象都是相同的,所以我在想是否可能有一些 docker IPC 或任何允许我存储和使用这些对象的相同实例的功能,所以我没有任何开销内存中相同对象的副本。有什么方法可以实现吗?

【问题讨论】:

如果你在进程 fork 之前创建对象,它们将在内存中获得对象的副本。为什么您的对象创建缓慢?根据您的代码,最好只缓存对象创建的缓慢部分而不是整个对象本身。这将为您提供更多关于如何存储缓存的选项。 对象创建速度很慢,因为这些对象是机器学习模型,其中每个对象可能高达几百兆字节。创建也需要按需进行,因为我不一定需要所有可能的对象。 也许你可以腌制对象并存储在 memcached 中 Docker 在这里不会直接帮助您,但它确实可以让您轻松地与其他容器一起运行专用缓存服务器(Redis、Memcached)。 Python 3.8 中有一些新的东西可能适合我的需要:link 我会尝试设置一个原型,看看它是如何工作的。 【参考方案1】:

容器都可以共享同一个卷挂载。这是一种在 Docker 容器之间共享数据的轻量级方式。

例如,我们的“服务器”可以简单地将数字附加到文件中:

#!/bin/bash

ID="$RANDOM"

while true ; do
    echo $ID >> /shared.txt
    sleep 1
done

然后我们创建一个 Dockerfile

FROM ubuntu:18.04
COPY main.sh /main.sh
CMD ["bash", "/main.sh"]

还有一个 docker-compose.yml 文件:

version:   '3'
services:
    one:
        build: ./
        volumes:
            - ./shared.txt:/shared.txt
    two:
        build: ./
        volumes:
            - ./shared.txt:/shared.txt

注意两个容器是如何挂载同一个文件的。他们每个人都会看到相同的东西。

使用docker-compose up 运行它,在一个单独的窗口中您将看到shared.txt 的以下输出:

25277
24626
25277
24626
25277
24626
25277
24626
25277

两个容器都可以写入同一个文件。您可以轻松地将其扩展到目录,以便拥有多个缓存对象。

【讨论】:

以上是关于在不同的docker容器之间共享python中的变量的主要内容,如果未能解决你的问题,请参考以下文章

在不同 docker-compose 文件中描述并在不同 docker-machines 中运行的容器之间创建 NFS 共享

如何在 Elastic Beanstalk 应用程序中的 Docker 容器之间共享卷?

是否可以在 docker 容器之间共享内存?

如何在我的Mac和Docker容器之间共享文件夹

docker数据卷应用场景

Docker容器间中的数据如何共享?