如何为同一文件夹中的每个微服务创建容器

How to Create a Container for Each Microservice in the Same Folder

我有一个项目有两个需要通过 REST 相互通信的微服务。对于每个微服务,我想在我的 Docker 中有一个容器。每个容器都会 运行 一个 Python 程序(微服务)。

如下所示,我们有一个文件组织方式的示例。假设 file_1.py 是一个微服务,file_2.py 是另一个微服务。对于它们中的每一个,我们都必须启动一个容器。

app
 |_ uwsgi.ini
 |_ file_1.py
 |_ file_2.py
  |_ folder_2
    |_ file_3
    |_ file_4

要启动容器,我们使用文件 uwgi.ini,如下所示:

[uwsgi]
module = file_1
callable = app
master = true
touch-reload = /app/uwsgi.ini

要启动容器,我们运行以下命令:

sudo docker run -d -v /app:/app -p docker_port:80 --name "container-name" "docker_name"

但是可以看出,这样的话,我们只能为第一个微服务file_1.py创建一个容器,因为在root app里面,我只能有一个uwsgi.ini在文件夹。使用上面的命令,它将搜索 uwsgi.ini 文件。

我想做的是每个容器都有一个uwsgi.ini。我见过有人这样做,将 uwsgi.ini 重命名为每个容器;对于我的情况,它可能是:uwsgi_file_1.iniuwsgi_file_2.ini。但是当我这样做时,启动容器的命令找不到 uswsgi 文件,因为我已经更改了它。有没有办法通过输入和 运行 之前显示的命令,让它搜索正确的 uwsgi.ini 文件?

两个简单的选项:

  1. 为每个容器创建不同的 Dockerfile,并在其中将每个容器的正确 .ini 文件复制到名称 uwsgi.ini
  2. 使用一个 Dockerfile 但制作一个入口点脚本,它将 ini 文件名的名称作为参数,然后在启动实际的 uwsgi 进程之前对其进行符号链接。

可能还有许多其他方法可以解决此问题..

您应该为每个服务创建一个单独的 Docker 图像。我建议将每个放在自己的目录中,甚至可能放在自己的存储库中:

app
+-- service1
| +-- Dockerfile
| +-- uwsgi.ini
| +-- setup.cfg
| \-- app1.py
|
+-- service2
| +-- Dockerfile
| +-- uwsgi.ini
| +-- setup.cfg
| \-- app2.py
|
\-- docker-compose.yml

每个 Docker 文件都可以相当独立。我在示例中的顶层放置了一个 docker-compose.yml 文件,作为一起启动服务的直接方式:

version: '3.8'
services:
  service1:
    build: ./service1
    ports: ['8001:80']
  service2:
    build: ./service2
    ports: ['8002:80']
    environment:
      - SERVICE_1_URL=http://service1

您建议的 docker run 命令有一个 -v 选项,可以用主机的内容覆盖图像的 /app 目录。您建议的解决方案和 都涉及对文件布局进行某种 Docker- 或特定于容器的更改;如果您是 运行 容器的多个副本,则绑定安装将隐藏更改或导致冲突。我建议删除此选项(或等效的 Compose volumes:);使用没有 Docker 的 Python 虚拟环境进行普通开发。