如何在Dockerfile中执行启动脚本

问题描述 投票:0回答:2

我想从jdk创建新图像,构建它,它的工作原理;当我运行我的新图像时,它返回容器ID,但是当docker ps,这是我的dockerfile时无法获取进程信息:

# specified jdk version
FROM openjdk:7-jre
# env
ENV APP_HOME /usr/src/KOAL-OCSP
ENV PATH $APP_HOME:$PATH
# copy my app in .zip to /usr/src
COPY myapp.zip /usr/src/
# unzip copy file
RUN unzip /usr/src/myapp.zip
WORKDIR $APP_HOME
#port
expose 80

#run the setup script of my app when start container 
CMD ["service.sh" "start"]

service.sh是一个安装脚本是我的应用程序根文件,我希望脚本可以在运行新的自构建映像时自动执行。

docker
2个回答
0
投票

我怀疑容器已成功执行并退出。只要您使用services.sh脚本开始的进程仍在运行,容器就会保持活动状态。

在您的情况下,services.sh已执行并退出,从而导致容器退出。

要查看所有容器,请使用docker ps -a

更新:

错误/bin/sh: 1: ./service.sh: not found表示在Docker镜像中的services.sh下找不到$APP_HOME脚本。确保使用$APP_HOME下添加它

ADD `service.sh` $APP_HOME

0
投票
CMD ["service.sh" "start"]

以上是无效的json,它在数组中缺少逗号,因此docker会将其作为字符串执行,因为["service.sh"不会被发现作为运行命令而失败。

如果您使用docker ps -a,您将看到所有容器的列表,包括已退出的容器。从那里,您可以使用docker logs $(docker ps -lq)查看您尝试运行的最后一个容器的日志。你可以docker inspect $(docker ps -lq)查看它试图运行的最后一个容器的所有细节,包括退出代码。

要超过当前错误,请使用缺少的逗号更正语法:

CMD ["service.sh", "start"]

对于您看到的下一个问题,“未找到”错误可能表示:

  • 该容器内不存在该命令(在预期的位置)。在您的方案中,请确保它包含在您在映像中解压缩的/ usr / src / KOAL-OCSP中。
  • shell脚本确实存在,但在第一行调用二进制文件中不存在的二进制文件。例如。如果你打电话给#!/bin/bash,但你的容器里只有/bin/sh。当您在Windows系统上编辑文件并使^M换行符成为容器正在查找的二进制文件名称(/bin/sh^M而不是/bin/sh)时,也会发生这种情况。
  • 对于二进制文件,如果您运行的可执行文件具有容器内不存在的库依赖项,则会发生这种情况。例如,如果您构建一个glibc环境并运行具有Alpine的musl libc环境的容器,则会出现相同的错误消息。
© www.soinside.com 2019 - 2024. All rights reserved.