Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 最佳实践10+个项目将使用一个容器/参数化_Python_Docker_Sh - Fatal编程技术网

Python 最佳实践10+个项目将使用一个容器/参数化

Python 最佳实践10+个项目将使用一个容器/参数化,python,docker,sh,Python,Docker,Sh,其想法是使用一个容器,其中包含所有小项目,并基于参数运行 目前的情况是什么: 我以这种方式使用项目文件夹: ├── MAIN_PROJECT_FOLDER │ ├── PROJECT_SUB_CATEGORY1 │ ├── ├── PROJECT_NAME_FOLDER1 │ │ │ ├── run.sh │ │ │ ├── main.py │ │ │ ├── config.py │ ├── ├── PROJECT_NAME_FOLDER2 │

其想法是使用一个容器,其中包含所有小项目,并基于参数运行

目前的情况是什么:

我以这种方式使用项目文件夹:

├── MAIN_PROJECT_FOLDER
│   ├── PROJECT_SUB_CATEGORY1
│   ├── ├── PROJECT_NAME_FOLDER1
│   │   │   ├── run.sh
│   │   │   ├── main.py
│   │   │   ├── config.py
│   ├── ├── PROJECT_NAME_FOLDER2
│   │   │   ├── run.sh
│   │   │   ├── main.py
│   │   │   ├── config.py
│   ├── PROJECT_SUB_CATEGORY2
│   ├── ├── PROJECT_NAME_FOLDER1
│   │   │   ├── run.sh
│   │   │   ├── main.py
│   │   │   ├── config.py
│   ├── ├── PROJECT_NAME_FOLDER2
│   │   │   ├── run.sh
│   │   │   ├── main.py
│   │   │   ├── config.py
每个run.sh文件都有prod/dev参数,可以按如下方式执行:

sudo ./run.sh prod = prod
sudo ./run.sh dev  = dev
sudo ./run.sh      = dev
sudo docker run CONTAINER_NAME PROJECT_NAME PROD/DEV
sudo docker run test_contaner test_project1 prod
sudo docker run test_contaner test_project1 dev
sudo docker run test_contaner test_project2 prod
... and so one
创建另一个.SH文件或Dockerfile的方法是什么,最后可以这样执行:

sudo ./run.sh prod = prod
sudo ./run.sh dev  = dev
sudo ./run.sh      = dev
sudo docker run CONTAINER_NAME PROJECT_NAME PROD/DEV
sudo docker run test_contaner test_project1 prod
sudo docker run test_contaner test_project1 dev
sudo docker run test_contaner test_project2 prod
... and so one
基本上,每个项目都是参数,prod/dev将以某种方式成为run.sh执行的一部分


正在寻找实现这一点的最佳实践。

我个人会使用这样的工具,它可以在一个docker容器中运行

在Ubuntu和基于Debian的发行版上安装supervisor:

sudo apt安装主管 正在启动监控程序守护程序:

sudo服务主管启动 在/etc/supervisord/supervisord.conf中,您将找到放置项目配置的位置:

[include]
files = /etc/supervisor/conf.d/*.conf
现在您可以为supervisor创建配置并将其复制到/etc/supervisor/conf.d/。项目1的主管配置示例:

project_1_supervisor.conf:

在此之后,请重新启动您的主管:

sudo supervisorctl重读 sudo supervisorctl更新 在此之后,您可以检查项目程序是否运行:

$ supervisorctl
project_1_app               RUNNING    pid 590, uptime 0:02:45

我个人会使用这样的工具,它可以在一个docker容器中运行

在Ubuntu和基于Debian的发行版上安装supervisor:

sudo apt安装主管 正在启动监控程序守护程序:

sudo服务主管启动 在/etc/supervisord/supervisord.conf中,您将找到放置项目配置的位置:

[include]
files = /etc/supervisor/conf.d/*.conf
现在您可以为supervisor创建配置并将其复制到/etc/supervisor/conf.d/。项目1的主管配置示例:

project_1_supervisor.conf:

在此之后,请重新启动您的主管:

sudo supervisorctl重读 sudo supervisorctl更新 在此之后,您可以检查项目程序是否运行:

$ supervisorctl
project_1_app               RUNNING    pid 590, uptime 0:02:45

最好的做法通常是拥有一个只做一件事的形象。在您的示例中,这意味着四个独立的Docker图像;每个目录都有自己的Dockerfile

使用环境变量比使用命令行参数更容易配置这样的设置。类似于和其他一些建筑服务实践的网站。根据我的经验,在Docker Compose或Kubernetes等YAML规范中,添加另一个键/值环境对比从多个不同的部分构建正确的命令行更容易

这将引导您进入一个序列,如

sudo docker build-t me/cat1proj1类别1/项目1 sudo docker run-e ENVIRONMENT=prod me/cat1proj1 在体系结构上,Docker容器运行任何单个进程,绝对没有任何东西可以阻止您编写所描述的包装器脚本。该单个命令被指定为入口点和命令的组合;如果同时指定这两个参数,则该命令将作为参数传递给入口点。命令部分可以在Dockerfile CMD中指定,但也可以在docker run命令行中重写

如果您根本不编写任何特殊脚本,则可以在将项目复制到正确目录的情况下运行

sudo docker运行test_image./test_project1/run.sh prod 我有两个项目是同一个应用程序,使用不同的脚本,以不同的方式启动它们——例如,Web服务器与使用相同代码的异步作业运行程序——并以这种方式使用备用启动脚本启动它们

有一种模式是将其他脚本作为入口点,并将命令解释为该脚本的参数。命令只是作为参数$1、$2、$@传递。这样做的问题是,它会中断一些例行调试路径

test_project1 prod作为参数传递给entrypoint脚本 sudo docker运行测试\图像测试\项目1产品 但这打破了获得调试外壳的过程 sudo docker run-rm-it test_image bash 更复杂的命令会变得笨拙 sudo docker run-rm-entrypoint=/bin/ls test\u image-l/app
最好的做法通常是拥有一个只做一件事的形象。在您的示例中,这意味着四个独立的Docker图像;每个目录都有自己的Dockerfile

使用环境变量比使用命令行参数更容易配置这样的设置。类似于和其他一些建筑服务实践的网站。根据我的经验,在Docker Compose或Kubernetes等YAML规范中,添加另一个键/值环境对比从多个不同的部分构建正确的命令行更容易

这将引导您进入一个序列,如

sudo docker build-t me/cat1proj1类别1/项目1 sudo docker run-e ENVIRONMENT=prod me/cat1proj1 在体系结构上,Docker容器运行任何单个进程,绝对没有任何东西可以阻止您编写所描述的包装器脚本 E该单个命令被指定为入口点和命令的组合;如果同时指定这两个参数,则该命令将作为参数传递给入口点。命令部分可以在Dockerfile CMD中指定,但也可以在docker run命令行中重写

如果您根本不编写任何特殊脚本,则可以在将项目复制到正确目录的情况下运行

sudo docker运行test_image./test_project1/run.sh prod 我有两个项目是同一个应用程序,使用不同的脚本,以不同的方式启动它们——例如,Web服务器与使用相同代码的异步作业运行程序——并以这种方式使用备用启动脚本启动它们

有一种模式是将其他脚本作为入口点,并将命令解释为该脚本的参数。命令只是作为参数$1、$2、$@传递。这样做的问题是,它会中断一些例行调试路径

test_project1 prod作为参数传递给entrypoint脚本 sudo docker运行测试\图像测试\项目1产品 但这打破了获得调试外壳的过程 sudo docker run-rm-it test_image bash 更复杂的命令会变得笨拙 sudo docker run-rm-entrypoint=/bin/ls test\u image-l/app
我认为处理这个问题的最好方法是ENV,下面是您正在寻找的完整示例

下面是目录结构

这里是最聪明的dockerfile,它可以克隆上面的应用程序并做一些聪明的事情;这将需要四个env,默认情况下它将运行projecta

ENV BASE_PATH="/opt/project"
此环境用于克隆期间的项目基本路径

  ENV PROJECT_PATH="/main/sub_folder_a/project_a"
此环境用于项目路径,例如项目B

ENV SCRIPT_NAME=hello.py

此ENV将用于运行实际文件,在您的情况下,实际文件可以是run.sh或main.py

环境系统_ENV=dev

此env用于run.sh这可以是dev或prod

构建docker形象

docker build -t multipy .
运行docker容器 docker run-rm-it multipy

默认情况下,这将运行项目a

对于项目b,您的命令将是

docker run-rm-it-env PROJECT\u PATH=/main/sub\u folder\u b/PROJECT\u b-env SCRIPT\u NAME=hello.py multipy

要运行run.sh bash文件,将使用以下命令

docker run-rm-it-env SCRIPT_NAME=run.sh multipy

这是一些日志的记录


我认为处理这个问题的最好方法是ENV,下面是您正在寻找的完整示例

下面是目录结构

这里是最聪明的dockerfile,它可以克隆上面的应用程序并做一些聪明的事情;这将需要四个env,默认情况下它将运行projecta

ENV BASE_PATH="/opt/project"
此环境用于克隆期间的项目基本路径

  ENV PROJECT_PATH="/main/sub_folder_a/project_a"
此环境用于项目路径,例如项目B

ENV SCRIPT_NAME=hello.py

此ENV将用于运行实际文件,在您的情况下,实际文件可以是run.sh或main.py

环境系统_ENV=dev

此env用于run.sh这可以是dev或prod

构建docker形象

docker build -t multipy .
运行docker容器 docker run-rm-it multipy

默认情况下,这将运行项目a

对于项目b,您的命令将是

docker run-rm-it-env PROJECT\u PATH=/main/sub\u folder\u b/PROJECT\u b-env SCRIPT\u NAME=hello.py multipy

要运行run.sh bash文件,将使用以下命令

docker run-rm-it-env SCRIPT_NAME=run.sh multipy

这是一些日志的记录


您可以使用来运行具有所需参数的项目。您只需创建一个文档中描述的配置文件,并将其复制到主管从中读取要加载的配置的目录中。@xbound根据提供的信息,是否很难获得它如何工作的示例?您可以使用来运行具有所需参数的项目。您只需创建一个文档中描述的配置文件,并将其复制到supervisor读取要加载的配置的目录中。@xbound根据提供的信息,是否很难获得它如何工作的示例?感谢您提供的非常有用的解释。在我的情况下,SudoDocker运行test_image test_project1 prod这个命令行正是我想要的。如果可能的话,你能解释一下进行不同测试项目的最佳方式是什么12,3,4,5吗。在docker文件中,我将获得副本/所以所有的项目文件夹都将被复制到容器中,我不知道如何设置每个项目将被分配到不同的参数?另外,我知道如何在每个容器中创建项目,但在单个容器中没有很多项目。谢谢您提供非常有用的解释。在我的情况下,SudoDocker运行test_image test_project1 prod这个命令行正是我想要的。如果可能的话,你能解释一下进行不同测试项目的最佳方式是什么12,3,4,5吗。在docker文件中,我将获得副本/因此,所有的项目文件夹都会被复制到容器中,这里的问题是我无法理解如何设置每个项目将被分配到不同的PAR。
阿米特?另外,我知道如何在每个容器中创建项目,但在单个容器中没有很多项目container@Oksana如果需要,请告诉我modification@Oksana如果需要修改,请告诉我