在 Dockerfile 中使用 shell 脚本启动多个服务

Starting multiple services using shell script in Dockerfile

我正在创建一个 Dockerfile 以使用 "docker run" 命令中的启动脚本来安装和启动 WebLogic 12c 服务。我在执行 startWeblogic.sh 和 startNodeManager.sh 脚本的 CMD 指令中传递 shell 脚本。但是当我登录到容器时,它只启动了第一个脚本 startWeblogic.sh 而甚至没有启动第二个脚本,这从 docker 日志中很明显。

在容器内手动执行相同的脚本,它正在启动这两个服务。 运行使脚本在容器中启动多个进程而不退出容器的正确指令是什么?

我在这个脚本和 docker 文件中缺少什么?我知道容器只能 运行 一个进程,但是以一种肮脏的方式,如何为像 WebLogic 这样具有名称服务器、节点管理器、托管服务器并创建托管域和机器的应用程序启动多个服务。托管服务器只能在 WebLogic 名称服务器为 运行ning 时启动。

脚本:startscript.sh

#!/bin/bash

# Start the first process
/u01/app/oracle/product/wls122100/domains/verdomain/bin/startWebLogic.sh -D
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start my_first_process: $status"
  exit $status
fi

# Start the second process
/u01/app/oracle/product/wls122100/domains/verdomain/bin/startNodeManager.sh -D
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start my_second_process: $status"
  exit $status
fi

while sleep 60; do
  ps aux |grep "Name=adminserver" |grep -q -v grep
  PROCESS_1_STATUS=$?
  ps aux |grep node |grep -q -v grep
  PROCESS_2_STATUS=$?
  # If the greps above find anything, they exit with 0 status
  # If they are not both 0, then something is wrong
  if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then
    echo "One of the processes has already exited."
    exit 1
  fi
done

T运行 分类 docker 文件。

RUN unzip $WLS_PKG 
RUN $JAVA_HOME/bin/java -Xmx1024m -jar /u01/app/oracle/$WLS_JAR -silent -responseFile /u01/app/oracle/wls.rsp -invPtrLoc /u01/app/oracle/oraInst.loc > install.log
RUN rm -f $WLS_PKG

RUN . $WLS_HOME/server/bin/setWLSEnv.sh && java weblogic.version
RUN java weblogic.WLST -skipWLSModuleScanning create_basedomain.py

WORKDIR /u01/app/oracle

CMD ./startscript.sh

docker 构建和 运行 命令:

docker build -f Dockerfile-weblogic --tag="weblogic12c:startweb" /var/dprojects
docker rund -d -it weblogic12c:startweb
docker exec -it 6313c4caccd3 bash

请在 docker 容器中为 运行 多个服务使用 supervisord。这将使整个过程更加健壮和可靠。 运行 supervisord -n 作为您的 CMD 命令并在 /etc/supervisord.conf.

中配置您的所有服务

示例 conf 如下所示:

[program:WebLogic]
command=/u01/app/oracle/product/wls122100/domains/verdomain/bin/startWebLogic.sh -D
stderr_logfile = /var/log/supervisord/WebLogic-stderr.log
stdout_logfile = /var/log/supervisord/WebLogic-stdout.log
autorestart=unexpected

[program:NodeManager]
command=/u01/app/oracle/product/wls122100/domains/verdomain/bin/startNodeManager.sh -D
stderr_logfile = /var/log/supervisord/NodeManager-stderr.log
stdout_logfile = /var/log/supervisord/NodeManager-stdout.log
autorestart=unexpected

它将处理您尝试使用 shell 脚本执行的所有操作。
希望对您有所帮助!