【问题标题】:sh script doesn't work in docker containersh 脚本在 docker 容器中不起作用
【发布时间】:2018-08-02 08:41:33
【问题描述】:

我在 docker 容器内运行 .sh 脚本时遇到问题。它给了我:

ml_1 | 2018-08-02 08:31:32,680 信息产生:'datagrid' 使用 pid 18

ml_1 | 2018-08-02 08:31:32,686 信息已退出:数据网格 (退出状态 127;不是预期的)

ml_1 | 2018-08-02 08:31:38,732 INFO 放弃:datagrid 进入 FATAL 状态,启动重试次数过快

我的脚本:

#!/bin/bash

# Description: 

LIB=/home/com/com_server/lib
CONFIG=/home/com/com_server/config
JAVA="/usr/bin/java"
CLASSPATH=${CONFIG}:blackBoard.xml:${CONFIG}:hazelcastContext.xml:${CONFIG}:comAppConfig.xml:${LIB}:com-calc-0.0.1.jar:${LIB}:com-common-0.0.1.jar:${LIB}:com-hazelcast-0.0.1-jar-with-dependencies.jar:${LIB}:escomled-server-0.0.1.jar:${LIB}:spring-webmvc-4.3.0.RELEASE.jar:${LIB}:spring-jdbc-4.3.0.RELEASE.jar:${LIB}:spring-context-4.3.0.RELEASE.jar:${LIB}:hazelcast-spring-3.7.2.jar:${LIB}:hazelcast-client-3.8.3.jar:${LIB}:hazelcast-spring-3.8.3.jar:${LIB}:hazelcast-all-3.8.3.jar:${LIB}:hazelcast-3.8.3.jar:${LIB}:spring-core-4.3.0.RELEASE.jar:${LIB}:spring-beans-4.3.0.RELEASE.jar:${LIB}:log4j-1.2.16.jar:${LIB}:commons-logging-1.2.jar:${LIB}:spring-asm-4.3.0.RELEASE.jar:${LIB}:spring-expression-4.3.0.RELEASE.jar:${LIB}:mysql-connector-java-5.1.34.jar:${LIB}:spring-tx-4.3.0.RELEASE.jar:${LIB}:commons-lang-2.6.jar:${LIB}:mail-1.4.1.jar:${LIB}:commons-digester-2.0.jar:${LIB}:commons-codec-1.4.jar:${LIB}:slf4j-log4j12-1.5.10.jar:${LIB}:slf4j-api-1.5.10.jar:${LIB}:config/createClient.sql:${LIB}:commons-fileupload-1.2.jar:${LIB}:commons-io-1.4.jar:${LIB}:spring-web-4.3.0.RELEASE.jar:${LIB}:opencsv-2.3.jar:${LIB}:spring-aop-4.3.0.RELEASE.jar:${LIB}:aopalliance-1.0.jar:${LIB}:pdfbox-1.8.9.jar:${LIB}:fontbox-1.8.9.jar:${LIB}:jempbox-1.8.9.jar:${LIB}:imgscalr-lib-4.2.jar:${LIB}:dom4j-1.6.1.jar:${LIB}:xmlbeans-2.6.0.jar:${LIB}:jasypt-1.9.2.jar:${LIB}:jackson-mapper-asl-1.9.4.jar:${LIB}:jackson-core-asl-1.9.4.jar:${LIB}:jackson-jaxrs-1.9.4.jar:${LIB}:cglib-2.2.2.jar:${LIB}:asm-3.3.1.jar:${LIB}:textmagic-java-sdk-1.2.0.jar:${LIB}:httpclient-4.5.5.jar:${LIB}:commons-dbcp2-2.3.0.jar:${LIB}:commons-pool2-2.5.0.jar:${LIB}:poi-3.17.jar:${LIB}:poi-ooxml-3.17.jar:${LIB}:commons-collections4-4.1.jar:${LIB}:poi-ooxml-schemas-3.17.jar
SERVER_NAME="com_datagrid"
SLOG_NAME="com_datagrid"
PID_FILE="/var/run/${SLOG_NAME}.pid"
MEMORY="512";
ARGS="-Djava.awt.headless=true -Xmx1024M -Dcom.sun.management.jmxremote=true \
                  -Dcom.sun.management.jmxremote.port=9092 \
                  -Dcom.sun.management.jmxremote.ssl=false \
                  -Dcom.sun.management.jmxremote.authenticate=false \
                  -Djava.rmi.server.hostname=10.72.4.13 -Dhazelcast.diagnostics.enabled=true -Dhazelcast.diagnostics.metric.level=info -Dhazelcast.diagnostics.invocation.sample.period.seconds=30 -Dhazelcast.diagnostics.pending.invocations.period.seconds=30 -Dhazelcast.diagnostics.slowoperations.period.seconds=30"
start() {
     tput setaf 2;echo "---- STARTING *** com_datagrid *** DAEMON ----"
     ${JAVA} ${ARGS} -classpath "${CLASSPATH}" com.com.blackboard.main.Server &
     javaPID=$!
     tput setaf 7;echo "*** com_datagrid *** backgrounded with process id '${javaPID}'"
     #echo ${javaPID} > ${PID_FILE}
}

stop() {
   echo "STOPING *** com_datagrid ***"
   start-stop-daemon --stop \
      --pidfile ${PID_FILE}
}
restart() {
     stop
     start
}
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        start
        ;;
esac

exit 0;

我的Dockerfile:

#FROM maven:3.3.9-jdk-8-alpine as build-env
#COPY . /comML
#WORKDIR comML
#RUN mvn package

FROM openjdk:8-jdk-alpine
WORKDIR /comML
ADD . /comML
ADD ./MLScripts/lib comML/lib
ADD ./MLScripts/config com/config
ADD ./MLScripts/config com/home/com/com_server/config
ADD ./MLScripts comML/MLScripts
ADD target/com-machine-learning-0.0.1-SNAPSHOT-jar-with-dependencies.jar comML/lib/com-machine-learning-0.0.1-SNAPSHOT-jar-with-dependencies.jar
COPY ./MLScripts/wrapper.sh /com/MLScripts/wrapper.sh
#CMD ["export", "CLASSPATH=comML/home/com/com_server/config/blackBoard.xml;EscomledML/home/com/com_server/config/appContext.xml;comML/home/com/com_server/config/config.properties;comML/home/com/com_server/config/com.properties;comML/home/com/escomled_server/config/createClient.sql;EscomledML/home/escomled/escomled_server/config/escomled.properties;com/home/com/com_server/config/global_database.sql;comML/home/com/com_server/config/release.sql;comML/home/escomled/com_server/config/taskExecutors.xml;comML/home/com/com_server/config/test-applicationContext.xml;C:/home/com/com_server/lib/spring-jdbc-4.3.0.RELEASE.jar;C:/home/escomled/escomled_server/lib/escomled-common-0.0.1.jar;C:/home/escomled/escomled_server/lib/escomled-machine-learning-0.0.1-SNAPSHOT-jar-with-dependencies.jar;C:/home/escomled/escomled_server/lib/assertj-core-3.3.0.jar;C:/home/escomled/escomled_server/lib/curator-test-2.9.0.jar;C:/home/escomled/escomled_server/lib/h2o-genmodel-3.18.0.1.jar;C:/home/escomled/escomled_server/lib/hazelcast-all-3.8.3.jar;C:/home/escomled/escomled_server/lib/jcl-over-slf4j-1.7.1.jar;C:/home/escomled/escomled_server/lib/junit-4.12.jar;C:/home/escomled/escomled_server/lib/spring-jdbc-4.3.0.RELEASE.jar;C:/home/escomled/escomled_server/lib/spring-dao-2.0.3.jar;C:/home/escomled/escomled_server/lib/kafka_2.11-0.10.2.1-cp1.jar;C:/home/escomled/escomled_server/lib/kafka_2.11-0.10.2.1-cp1-test.jar;C:/home/escomled/escomled_server/lib/kafka-clients-0.10.2.1-cp1.jar;C:/home/escomled/escomled_server/lib/spring-context-4.3.0.RELEASE.jar;C:/home/escomled/escomled_server/lib/spring-core-4.3.0.RELEASE.jar;C:/home/escomled/escomled_server/lib/spring-tx-4.3.0.RELEASE.jar;C:/home/escomled/escomled_server/lib/hazelcast-all-3.8.3.jar;C:/home/escomled/escomled_server/lib/kafka-clients-0.10.2.1-cp1-test.jar;C:/home/escomled/escomled_server/lib/kafka-schema-registry-3.2.1.jar;C:/home/escomled/escomled_server/lib/kafka-schema-registry-3.2.1-tests.jar;C:/home/escomled/escomled_server/lib/kafka-streams-0.10.2.1-cp1.jar;C:/home/escomled/escomled_server/lib/slf4j-api-1.7.1.jar;C:/home/escomled/escomled_server/lib/slf4j-log4j12-1.7.1.jar"] 
#ENTRYPOINT ["java", "-cp", "EscomledML/home/escomled/escomled_server/config/blackBoard.xml;EscomledML/home/escomled/escomled_server/config/appContext.xml;EscomledML/home/escomled/escomled_server/config/config.properties;EscomledML/home/escomled/escomled_server/config/escomled.properties;EscomledML/home/escomled/escomled_server/config/createClient.sql;EscomledML/home/escomled/escomled_server/config/escomled.properties;EscomledML/home/escomled/escomled_server/config/global_database.sql;EscomledML/home/escomled/escomled_server/config/release.sql;EscomledML/home/escomled/escomled_server/config/taskExecutors.xml;EscomledML/home/escomled/escomled_server/config/test-applicationContext.xml;C:/home/escomled/escomled_server/lib/spring-jdbc-4.3.0.RELEASE.jar;C:/home/escomled/escomled_server/lib/escomled-common-0.0.1.jar;C:/home/escomled/escomled_server/lib/escomled-machine-learning-0.0.1-SNAPSHOT-jar-with-dependencies.jar;C:/home/escomled/escomled_server/lib/assertj-core-3.3.0.jar;C:/home/escomled/escomled_server/lib/curator-test-2.9.0.jar;C:/home/escomled/escomled_server/lib/h2o-genmodel-3.18.0.1.jar;C:/home/escomled/escomled_server/lib/hazelcast-all-3.8.3.jar;C:/home/escomled/escomled_server/lib/jcl-over-slf4j-1.7.1.jar;C:/home/escomled/escomled_server/lib/junit-4.12.jar;C:/home/escomled/escomled_server/lib/spring-jdbc-4.3.0.RELEASE.jar;C:/home/escomled/escomled_server/lib/spring-dao-2.0.3.jar;C:/home/escomled/escomled_server/lib/kafka_2.11-0.10.2.1-cp1.jar;C:/home/escomled/escomled_server/lib/kafka_2.11-0.10.2.1-cp1-test.jar;C:/home/escomled/escomled_server/lib/kafka-clients-0.10.2.1-cp1.jar;C:/home/escomled/escomled_server/lib/spring-context-4.3.0.RELEASE.jar;C:/home/escomled/escomled_server/lib/spring-core-4.3.0.RELEASE.jar;C:/home/escomled/escomled_server/lib/spring-tx-4.3.0.RELEASE.jar;C:/home/escomled/escomled_server/lib/hazelcast-all-3.8.3.jar;C:/home/escomled/escomled_server/lib/kafka-clients-0.10.2.1-cp1-test.jar;C:/home/escomled/escomled_server/lib/kafka-schema-registry-3.2.1.jar;C:/home/escomled/escomled_server/lib/kafka-schema-registry-3.2.1-tests.jar;C:/home/escomled/escomled_server/lib/kafka-streams-0.10.2.1-cp1.jar;C:/home/escomled/escomled_server/lib/slf4j-api-1.7.1.jar;C:/home/escomled/escomled_server/lib/slf4j-log4j12-1.7.1.jar", "com.escomled.machinelearning.ml.Escomled_Streams_H2O_ML"]
#CMD ["java", "-jar", "escomled-machine-learning-0.0.1-SNAPSHOT-jar-with-dependencies.jar"]
EXPOSE 8085
#ENTRYPOINT ["sh", "EscomledML/MLScripts/wrapper.sh"]
#ENTRYPOINT ["sh", "EscomledML/MLScripts/escomled_data_grid.sh"]
#CMD ["sh", "EscomledML/MLScripts/escomled_dirwatcher.sh", "&&", "sh", "EscomledML/MLScripts/escomled_startmap.sh", "&&", "sh", "EscomledML/MLScripts/escomled_ml.sh"]

FROM ubuntu:14.04
RUN apt-get update && apt-get install -y supervisor
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
CMD /usr/bin/supervisord -n

还有我的.bat 脚本:

set LIB=C:/home/escomled/escomled_server/lib
set CONFIG=C:/home/escomled/escomled_server/config
set JAVA_HOME="C:\Program Files\Java\jdk1.8.0_144"
set CLASSPATH=%CONFIG%/blackBoard.xml;%CONFIG%/hazelcastContext.xml;%CONFIG%/escomledAppConfig.xml;%LIB%/escomled-calc-0.0.1.jar;%LIB%/escomled-common-0.0.1.jar;%LIB%/escomled-hazelcast-0.0.1-jar-with-dependencies.jar;%LIB%/escomled-server-0.0.1.jar;%LIB%/spring-webmvc-4.3.0.RELEASE.jar;%LIB%/spring-jdbc-4.3.0.RELEASE.jar;%LIB%/spring-context-4.3.0.RELEASE.jar;%LIB%/hazelcast-spring-3.7.2.jar;%LIB%/hazelcast-client-3.8.3.jar;%LIB%/hazelcast-spring-3.8.3.jar;%LIB%/hazelcast-all-3.8.3.jar;%LIB%/hazelcast-3.8.3.jar;%LIB%/spring-core-4.3.0.RELEASE.jar;%LIB%/spring-beans-4.3.0.RELEASE.jar;%LIB%/log4j-1.2.16.jar;%LIB%/commons-logging-1.2.jar;%LIB%/spring-asm-4.3.0.RELEASE.jar;%LIB%/spring-expression-4.3.0.RELEASE.jar;%LIB%/mysql-connector-java-5.1.34.jar;%LIB%/spring-tx-4.3.0.RELEASE.jar;%LIB%/commons-lang-2.6.jar;%LIB%/mail-1.4.1.jar;%LIB%/commons-digester-2.0.jar;%LIB%/commons-codec-1.4.jar;%LIB%/slf4j-log4j12-1.5.10.jar;%LIB%/slf4j-api-1.5.10.jar;%LIB%/config/createClient.sql;%LIB%/commons-fileupload-1.2.jar;%LIB%/commons-io-1.4.jar;%LIB%/spring-web-4.3.0.RELEASE.jar;%LIB%/opencsv-2.3.jar;%LIB%/spring-aop-4.3.0.RELEASE.jar;%LIB%/aopalliance-1.0.jar;%LIB%/pdfbox-1.8.9.jar;%LIB%/fontbox-1.8.9.jar;%LIB%/jempbox-1.8.9.jar;%LIB%/imgscalr-lib-4.2.jar;%LIB%/dom4j-1.6.1.jar;%LIB%/xmlbeans-2.6.0.jar;%LIB%/jasypt-1.9.2.jar;%LIB%/jackson-mapper-asl-1.9.4.jar;%LIB%/jackson-core-asl-1.9.4.jar;%LIB%/jackson-jaxrs-1.9.4.jar;%LIB%/cglib-2.2.2.jar;%LIB%/asm-3.3.1.jar;%LIB%/textmagic-java-sdk-1.2.0.jar;%LIB%/httpclient-4.5.5.jar;%LIB%/commons-dbcp2-2.3.0.jar;%LIB%/commons-pool2-2.5.0.jar;%LIB%/poi-3.17.jar;%LIB%/poi-ooxml-3.17.jar;%LIB%/commons-collections4-4.1.jar;%LIB%/poi-ooxml-schemas-3.17.jar

set SERVER_NAME="escomled_server"
set SLOG_NAME="escomled_server"
set PID_FILE="/var/run/%SLOG_NAME%.pid"
set MEMORY="512";
 set ARGS="-Djava.awt.headless=true -Xmx1024M -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=9092 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=10.72.4.13 -Dhazelcast.diagnostics.enabled=true -Dhazelcast.diagnostics.metric.level=info -Dhazelcast.diagnostics.invocation.sample.period.seconds=30 -Dhazelcast.diagnostics.pending.invocations.period.seconds=30 -Dhazelcast.diagnostics.slowoperations.period.seconds=30"
:start
   ECHO "---- STARTING *** DataGrid *** DAEMON ----"
   %JAVA_HOME%\bin\java.exe %ARGS% -classpath %CLASSPATH% com.escomled.blackboard.main.DataGridServer
   ECHO "*** DataGrid *** backgrounded with process id %javaPID%"
   ECHO %javaPID% > %PID_FILE%
   EXIT /B 0

:stop
   ECHO "STOPING *** DataGrid ***"
   start-stop-daemon --stop --pidfile %PID_FILE%
   EXIT /B 0

:restart
     CALL :stop
     CALL :start

rem case "$1" in
rem  start)
rem        start
rem        ;;
rem  stop)
rem        stop
rem        ;;
rem  restart)
rem        stop
rem        start
rem        ;;
rem esac

rem exit 0;

如果我解释不正确,我会编辑问题。谢谢。

【问题讨论】:

  • 您确定问题出在脚本上吗?您提供的输出似乎是 Java 日志,即脚本成功启动了应用程序,但应用程序本身失败了。
  • 我有一个带有应用程序的.bat 脚​​本,它工作正常。但是.sh 脚本不起作用
  • 这个脚本是在容器启动时启动的,还是你在已经运行的容器上手动执行的?您可以从容器内正确访问数据库吗?你能分享你提到的工作 .bat 脚本,因为这是有问题的 bash 脚本吗?您是否尝试按照以下答案中的建议将守护程序启动序列重组为前台,并且您可以共享确切的脚本。这确实看起来像应用程序错误,所以它缺少一些配置细节......
  • 感谢您的回复。我现在将使用Dockerfile 和.bat 脚本编辑问题。我尝试了建议的andswer,它给出了同样的错误。问题是 1 Dockerfile 在前台只能有 1 个命令
  • @MilanPanic, .bat 适用于 Windows,因此,问题可能是特定于环境的(导致进程在 Linux 中死掉,但在 Windows 中没有)。我认为解决此问题的良好起点是使用/bin/bash cmd 以交互方式启动容器,然后尝试手动启动应用程序(只需在容器中运行java ... 而无需任何启动脚本)。这将有助于确定问题是在环境中(特定于操作系统、特定于 Docker 等)还是其他地方。

标签: bash docker


【解决方案1】:

我在 docker 容器中运行 .sh 脚本时遇到问题

这里有很多问题...只是一些提示:

  • 你的配置文件结构有点乱,来自Dockerfile:

    WORKDIR /EscomledML
    ADD . /EscomledML
    ADD ./MLScripts/lib EscomledML/lib
    ADD ./MLScripts/config EscomledML/config
    ADD ./MLScripts/config EscomledML/home/escomled/escomled_server/config
    ADD ./MLScripts EscomledML/MLScripts
    

    不会真正被脚本正确定位,因为它在其他地方期待它:

    LIB=/home/escomled/escomled_server/lib
    CONFIG=/home/escomled/escomled_server/config
    

    检查所有文件位置以确认它们已正确放置在应有的位置。

  • 守护进程应该作为主进程在前台启动。由于您首先在启动过程中遇到问题,请尝试使用 /bin/bash 交互启动容器并正确敲定启动脚本,然后再将其设置为 Dockerfile 的入口点。

  • 您正试图从一个操作系统迁移到另一个操作系统。安装细节和环境差异可能是您的应用无法正常启动的原因。

  • 您可以在 docker 中直接使用 build args 和 env 变量来避免在脚本中初始化它们。确保所有环境变量都已正确初始化

评论后编辑:

您还遇到了multistage build 的问题...来自上一阶段的工件您没有转移到上一阶段,实际上是倾倒了它们。这就是为什么您在最后阶段之后没有任何文件夹的原因。您需要COPY --from=0 ... 的效果并检查您想要的结果,因为您可能在这里误用了多阶段构建(主要目的是在前一层构建一些东西作为一次性构建阶段,而不是将两个图像组合成一个)。

在下一条评论后编辑:

在我看来,您使用 ubuntu 映像的唯一方法就是安装 supervisord。如果是这种情况,那么只需替换以下行:

FROM ubuntu:14.04
RUN apt-get update && apt-get install -y supervisor

与:

apk add --update supervisor

将在 alpine 映像中安装 supervisord,你会很高兴的。

请注意,您的目录结构看起来很混乱(您首先添加.,然后添加子文件夹等),因此请务必查看这些内容。我不知道你想要的目录结构是什么,但你应该能够在那里做出正面或反面......

【讨论】:

  • 在脚本中的LIB 和CONFIG 路径,我将它们更改为LIB=./MLScripts/lib 和CINFIG=./MLScripts/config,但它仍然无法正常工作。我有一个配置nodaemon=true。
  • 只有在第一个 Dockerfile ADD 命令中,您才引用绝对路径。从第二个ADD 开始,您正在引用相对于WORKDIR 的路径...检查容器上/EscomledML 文件夹的内容并将它们与您想要的状态进行比较...此时我只能猜测,但我怀疑你想要这个命令ADD ./MLScripts/lib EscomledML/lib 将文件放在/EscomledML/EscomledML/lib 中...您的构建配置对我们来说仍然是一个谜,所以只有您可以制作这些添加命令的头部或尾部以及容器中文件夹和文件的所需布局......
  • 我找不到文件夹 EscomledML,它没有将它添加到容器中
  • 是的,您也没有正确使用多级 docker build。检查答案中的编辑。
  • 我怎样才能正确使用它,但要具有相同的功能?
【解决方案2】:

首先,启动系统服务或后台进程的命令(service、systemctl、initctl、start-stop-daemon,...)在 Docker 中不起作用。

如果在初始环境变量设置后将所有脚本替换为在前台运行实际服务器的命令

#!/bin/sh
LIB=...
...
ARGS=...
exec ${JAVA} ${ARGS} -classpath "${CLASSPATH}" com.escomled.blackboard.main.DataGridServer

Docker 容器将一直运行直到该服务器进程退出,这是您通常想要的。

【讨论】:

  • 感谢您的回复。我试过了,但它不再工作了
猜你喜欢
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2021-05-17
  • 2020-12-20
  • 1970-01-01
相关资源
最近更新 更多