如何为同一文件夹中的每个微服务创建容器
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.ini
和 uwsgi_file_2.ini
。但是当我这样做时,启动容器的命令找不到 uswsgi 文件,因为我已经更改了它。有没有办法通过输入和 运行 之前显示的命令,让它搜索正确的 uwsgi.ini
文件?
两个简单的选项:
- 为每个容器创建不同的 Dockerfile,并在其中将每个容器的正确 .ini 文件复制到名称
uwsgi.ini
- 使用一个 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 虚拟环境进行普通开发。
我有一个项目有两个需要通过 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.ini
和 uwsgi_file_2.ini
。但是当我这样做时,启动容器的命令找不到 uswsgi 文件,因为我已经更改了它。有没有办法通过输入和 运行 之前显示的命令,让它搜索正确的 uwsgi.ini
文件?
两个简单的选项:
- 为每个容器创建不同的 Dockerfile,并在其中将每个容器的正确 .ini 文件复制到名称
uwsgi.ini
- 使用一个 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
目录。您建议的解决方案和 volumes:
);使用没有 Docker 的 Python 虚拟环境进行普通开发。