向dockerfile添加启动脚本

向dockerfile添加启动脚本,docker,dockerfile,Docker,Dockerfile,我已经使用openjdk构建了我的docker映像 # config Dockerfile FROM openjdk:8 COPY . /usr/src/myapp WORKDIR /usr/src/myapp # build image docker build -t shantanuo/dbt . 它正在使用此命令按预期工作 docker run -p 8081:8080 -it shantanuo/dbt sh bin/startup.sh 登录后,我必须运行此命令 docker

我已经使用openjdk构建了我的docker映像

# config Dockerfile
FROM openjdk:8
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp

# build image
docker build -t shantanuo/dbt .
它正在使用此命令按预期工作

docker run -p 8081:8080  -it shantanuo/dbt
sh bin/startup.sh
登录后,我必须运行此命令

docker run -p 8081:8080  -it shantanuo/dbt
sh bin/startup.sh

我的问题:是否可以将启动命令添加到dockerfile?我尝试在dockerfile中添加这一行

CMD ["sh", "bin/startup.sh"]

但是在构建映像之后,我不能使用-d参数来启动容器。

您可以使用来运行启动脚本。在入口点中,您可以指定自定义脚本,然后运行catlina.sh。例如:

ENTRYPOINT "bin/startup.sh && catalina.sh run"

这将运行启动脚本,然后启动tomcat服务器。它不会离开集装箱

docker容器必须具有专用任务。重要的是,此任务/启动脚本不会终止。当它这样做时,任务就完成了,docker的一切都做对了

仅用JDK启动容器是没有意义的。你必须把你的申请放进去

我认为当你发布你真正想做的事情时会有所帮助


Docker参考始终是一个很好的查看位置:

此处的文档对此进行了说明:

如果某个进程依赖于主进程,则首先使用类似的脚本启动辅助进程,然后再启动主进程并删除fg%1行

#!/bin/bash
  
# turn on bash's job control
set -m
  
# Start the primary process and put it in the background
./my_main_process &
  
# Start the helper process
./my_helper_process
  
# the my_helper_process might need to know how to wait on the
# primary process to start before it does its work and returns
  
  
# now we bring the primary process back into the foreground
# and leave it there
fg %1

“我不能使用-d参数启动容器”:为什么?也许你的启动脚本退出得太早了。当命令退出时,容器停止。如何保持命令运行?换句话说,我不希望容器在启动tomcat服务后退出。shell脚本在没有docker的情况下可以正常工作。如果是tomcat,则在手动运行脚本时开始使用
CMD[“bin/catalina.sh”,“run”]
,它是否在后台运行tomcat并返回bash shell?TarunLalwani是的,它会@亨利:是的,将CMD添加到dockerfile成功了。我没有修改startup.sh文件。所以我想跳过它是可以的。对吗?@Henry我添加了一个示例来演示entrypoint的用法。这使用入口点的exec形式。他还可以做另一件事,那就是在启动脚本末尾附加
catlina.sh run
命令。我在中使用了类似的东西,我认为我已经正确地为dockerfile编写了等效的语法。