Dockerfile从中运行bash脚本时引发错误

时间:2019-10-31 14:06:38

标签: bash docker jenkins docker-compose devops

我有一个如下所示的Dockerfile:

#1st stage - wildfly production image
FROM wildfly-setup:17.0.0 AS wildfly-prod
USER jenkins
RUN mkdir /opt/wildfly/install && mkdir /opt/wildfly/install/config
COPY --chown=jenkins:jenkins init.sh /opt/wildfly/bin
RUN mkdir -p $JBOSS_HOME/standalone/data/datastorage
#Second stage - test run image
FROM wildfly-prod AS wildfly-sedi-test
USER jenkins
COPY --chown=jenkins:jenkins init.sh /opt/wildfly/bin
RUN /opt/wildfly/bin/init.sh
#CMD ["/opt/wildfly/bin/init.sh"]

从上面的Dockerfile运行的bash脚本如下:

#!/bin/bash

if [ -e "$JBOSS_HOME/install/wildfly.sh" ] ; then
    $JBOSS_HOME/install/wildfly.sh
    rm $JBOSS_HOME/install/wildfly.sh
fi

# check for postgres running or not 
cnt=0
psql_terminate=2
while (( $cnt < 120 && $psql_terminate != 0 )); do
    postgres_isready -h $POSTGRES > /dev/null 2>&1

    if [ $? -eq 0 ] ; then
        let psql_terminate=0
        echo $psql_terminate
    fi

    let cnt=cnt+1
    sleep 1
done

if (( $psql_terminate == 0)) ; then
    exec $JBOSS_HOME/bin/standalone.sh -c standalone-full.xml
else
    echo "database unavailable."
    exit 1
fi

在Dockerfile中,当我无法使用CMD命令时,它可以工作,但是使用RUN命令时,在构建映像时会抛出以下错误:

  

命令'/ bin / sh -c /opt/wildfly/bin/init.sh'返回了非零代码:1

有人可以帮我吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

this blog post 将在构建图像时执行bash脚本。

  

RUN 指令将在以下位置的新层中执行所有命令   在当前图像的顶部并提交结果。所结果的   已提交的映像将用于Dockerfile中的下一步。

RUN 将在启动容器时执行bash脚本。

  

CMD 的主要目的是为执行中的容器提供默认值。这些默认值可以包含可执行文件,也可以忽略可执行文件,在这种情况下,您还必须指定ENTRYPOINT指令。

所以我假设您的脚本到达了exit 1,因为它应该在容器启动时而不是在构建映像时运行。