我有一个如下所示的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
有人可以帮我吗?
谢谢。
答案 0 :(得分:1)
this blog post 将在构建图像时执行bash脚本。
RUN 指令将在以下位置的新层中执行所有命令 在当前图像的顶部并提交结果。所结果的 已提交的映像将用于Dockerfile中的下一步。
RUN 将在启动容器时执行bash脚本。
CMD 的主要目的是为执行中的容器提供默认值。这些默认值可以包含可执行文件,也可以忽略可执行文件,在这种情况下,您还必须指定ENTRYPOINT指令。
所以我假设您的脚本到达了exit 1
,因为它应该在容器启动时而不是在构建映像时运行。