如何基于参数从Shell脚本启动Docker容器

我有一个具有以下结构的python应用程序:

./DB  
./lib  
./docker-compose.yml  
./Dockerfile  
./module1.py  
./module2.py  
./module3.py  
./app_run.sh  
./requirements.txt  

我想要得到的东西

  • MySQL服务器在单独的容器上运行。
  • 应用docker映像。
  • 模块的脚本作为app_run.sh中的容器单独运行。

我的应用程序映像大约为1.5G,所以我想要实现的是拥有一个应用程序映像,该映像能够使用唯一的某个模块运行多个容器。这样我就可以使用module1.py脚本(或任何其他脚本)或许多此类脚本来运行容器。

我希望以这种方式加快处理速度,因为不需要每次都构建应用程序映像,而只需建立连接即可。

为什么我需要从应用程序外壳脚本运行此类容器。
Shell脚本从外部源获取所需的参数(例如URL和令牌),然后在模块中使用它们。

shell脚本具有以下结构:

#!/bin/sh

ip=$1
url=$2
token=$3

folder="./temp/"
folder_oss='./temp/DB/TEST/'
db_folder="./temp/DB"
app="./"

name=$(date '+%Y%m%d%H%M%S')

cd $folder && mkdir -p "$folder$name"
folder="$folder$name"
cd $app

if [ $ip = 1 ]; then
python3.6 ./module1.py -u $url -t $token -f $folder -d $db_folder 
 status=${PIPESTATUS};
elif [ $ip = 3 ]; then
python3.6 ./module2.py -u $url -t $token -f $folder |& tee "$folder/logtemp.txt"
status=${PIPESTATUS};
elif [ $ip = 7 ]; then
python3.6 ./module.py -u $url -t $token -f $folder -d $db_folder |& tee "$folder/load_logtemp.txt"
status=${PIPESTATUS};
else
   echo "Error while predicting"
   status=1;
fi  

我想代替python3.6 ./module1.py我应该写一些类似docker container run的东西。但是我应该如何将那些模块指定为单独的容器?

当前,我的Dockerfile如下所示:

FROM python:3.6
COPY . /app
WORKDIR /app
RUN pip freeze > requirements.txt
EXPOSE 7524
CMD ["./app_run.sh","1","link/to/settings.json,"token"]  

还有docker_compose.yml:

version: "2"
services:
   app:
     build: .
     environment:
        - DB_HOST=mysql
        - DB_PORT=7524
     ports:
        - 8080:8080
     depends_on:
        - mysql

   mysql:
     image: mysql:latest
     restart: always
     environment:
        - MYSQL_USER=user
        - MYSQL_ROOT_PASSWORD=54321
     ports:
        - 7524:3303
     volumes:
       - my-db:/var/lib/mysql

 volumes:
    my-db:
c68654626 回答:如何基于参数从Shell脚本启动Docker容器

一种选择是覆盖docker-compose.yml中的命令(请参见https://docs.docker.com/compose/compose-file/compose-file-v2/#command

您甚至可以设置环境变量。

类似的东西:

services:
  app:
    ...
    command:
      - "./app_run.sh"
      - ${IP}
      - ${URL}
      - ${TOKEN}

然后可以使用以下命令开始运行:

$ IP=1 URL="link/to/settings.json" TOKEN=token docker-compose up

moduleX.py文件挂载到容器中也可能是有益的,因此,如果添加更多模块,则无需重新构建它。如果这些模块文件位于它们自己的文件夹中,这可能是最简单的。然后您可以使用类似(在docker-compose.yml中)的方法:

services:
  app:
    ...
    volumes: ./modules:/app/modules

另请参见有关卷的文档:https://docs.docker.com/compose/compose-file/compose-file-v2/#volumes

,

app_run.sh移动到入口点,并将模块名称和IP,令牌等传递到CMD。您的Dockerfile看起来像

FROM python:3.6
COPY . /app
WORKDIR /app
EXPOSE 7524
RUN chmod +x app_run.sh
ENTRYPOINT ["./app_run.sh"]
CMD ["1","link/to/settings.json","token"] 

,然后在entrypoint中处理这些参数,在您的情况下为app_run.sh`

#!/bin/sh
ip=$1
url=$2
token=$3
echo "IP is $ip,URL is $url,token is $token"
mkdir temp
folder="./temp/"
folder_oss='./temp/DB/TEST/'
db_folder="./temp/DB"
app="./"

name=$(date '+%Y%m%d%H%M%S')

cd $folder
mkdir -p "$folder$name"
folder="$folder$name"
cd $app

if [ $ip = 1 ]; then
python3.6 ./module1.py -u $url -t $token -f $folder -d $db_folder 
 status=${PIPESTATUS};
elif [ $ip = 3 ]; then
python3.6 ./module2.py -u $url -t $token -f $folder  
status=${PIPESTATUS};
elif [ $ip = 7 ]; then
python3.6 ./module.py -u $url -t $token -f $folder -d $db_folder 
status=${PIPESTATUS};
else
   echo "Error while predicting"
   status=1;
fi 

请记住一件事,如果python在前台运行并且它的运行时间很长,那么它的状态将无法访问status=${PIPESTATUS};

因此,如果您想使用 IP 3 运行容器,则只需

docker run -it --rm my_image "3" "link/to/settings.json" "token

默认情况下,它将以IP 1运行。

本文链接:https://www.f2er.com/3142853.html

大家都在问