如何在Dockerfile中执行启动脚本

时间:2018-03-05 12:48:29

标签: docker

我想从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是一个安装脚本是我的应用程序根文件,我希望在运行新的自构建映像时脚本可以自动执行。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"]

对于您看到的下一个问题,未找到&#34;&#34;错误可以表明:

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