如何在一个Docker中同时运行多个程序进程?

那么基本思路是在Dockerfile 的CMD 或者 ENTRYPOINT 运行一个”东西”,然后再让这个”东西”运行多个其他进程 简单说来是用Bash Shell脚本或者三方进程守护 (Monit,Skaware S6,Supervisor),其他没讲到的三方进程守护工具同理

Bash Shell脚本

入口文件运行一个Bash Shell 脚本, 然后在这个脚本内去拉起多个进程 注意最后要增加一个死循环不要让这个脚本退出,否则拉起的进程也退出了 run.sh

#!/bin/bash
 
# start 1
start1  > /var/log/start1.log 2>&1 &
# start 2
start2 > /var/log/start2.log 2>&1 &
 
# just keep this script running
while [[ true ]]; do
    sleep 1
done

 

在Dockerfile的入口中运行run.sh

ENTRYPOINT  ["run.sh"]

 

用Bash Shell 的方式,任意发行版的linux都支持,缺点是不能拉起crash的进程,也就是只能拉起运行不能”守护” 如果不关心进程crash问题那么可以用这种方式

 

启动脚本范例:

#!/bin/bash

# short for Host Home
HH="/home/work/s2"

# short for Container Home
CH="/home/work/app/s2"

#==============env start===============#

DOCKER_ENV=""

# 时区
DOCKER_ENV=" -e TZ=Asia/Shanghai $DOCKER_ENV "

# 中文支持
DOCKER_ENV=" -e LC_ALL=C.UTF-8 $DOCKER_ENV "

# gpu
DOCKER_ENV=" -e CUDA_VISIBLE_DEVICES=${cuda.visible.devices} $DOCKER_ENV "

# CAFFE_PREDICT_DEVICEID
DOCKER_ENV=" -e CAFFE_PREDICT_DEVICEID=0 $DOCKER_ENV "
#==============env end=================#


#==============volumes start===============#

DOCKER_VOLUMES=""

# 配置文件挂载
DOCKER_VOLUMES=" -v $HH/data/data:$CH/data/ $DOCKER_VOLUMES "
# 日志文件挂载
DOCKER_VOLUMES=" -v $HH/logs:$CH/log $DOCKER_VOLUMES "

#==============volumes end=================#

docker run --restart=always --runtime=nvidia -ti -d --security-opt seccomp:unconfined --cap-add SYS_PTRACE -p $${serverId}:8120 --name content-ocr-s2-${serverId} $DOCKER_ENV $DOCKER_VOLUMES $DOCKER_IMAGE

 

posted @ 2021-04-20 11:05  鸭子船长  阅读(2098)  评论(0编辑  收藏  举报