那么基本思路是在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