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