在 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 脚本执行的所有操作。
希望对您有所帮助!
我正在创建一个 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 脚本执行的所有操作。
希望对您有所帮助!