Tomcat Docker for development and production

Tomcat Docker for development and production,tomcat,docker,docker-compose,dockerfile,jrebel,Tomcat,Docker,Docker Compose,Dockerfile,Jrebel,我有一个与此类似的Dockerfile: FROM tomcat:7-jre8-alpine ... ENTRYPOINT ["sh", "docker-entrypoint.sh"] 我希望在完成所有测试和开发之后能够在生产中使用它。在开发过程中,我希望使用JRebel并激活调试,最好不要更改Dockerfile或需要额外的文件。不幸的是,jrebel.jar需要成为容器/映像的一部分,并且JAVA\u OPTS需要通过以下方式进行增强: "-javaagent:/jrebel.jar -D

我有一个与此类似的
Dockerfile

FROM tomcat:7-jre8-alpine
...
ENTRYPOINT ["sh", "docker-entrypoint.sh"]
我希望在完成所有测试和开发之后能够在生产中使用它。在开发过程中,我希望使用JRebel并激活调试,最好不要更改Dockerfile或需要额外的文件。不幸的是,
jrebel.jar
需要成为容器/映像的一部分,并且
JAVA\u OPTS
需要通过以下方式进行增强:

"-javaagent:/jrebel.jar -Drebel.remoting_plugin=true"
此外,tomcat debuggin还必须通过以下方式启用:

"-agentlib:jdwp=transport=dt_socket, address=1043, server=y, suspend=n"
是否可以使用一个
Dockerfile
,然后通过运行选项或类似的方式启用我需要的开发选项?在开发过程中使用“高效”的docker映像来运行容器的可行选项是什么

然后通过运行选项或类似的方式启用我需要的开发选项

作为一个可能的“运行选项”,您可以使用在(或)上定义的环境变量

然后,您可以让图像使用一个脚本,该脚本根据
$ENV
的不同,调整
JAVA\u OPTS
或tomcat选项


如果未定义
$ENV
,或者未定义并等于“
dev
”以外的任何值,则不激活调试选项。

典型的方法是在启动容器时指定不同的命令。您可以同时覆盖入口点和CMD

docker run -d --entrypoint "[]" myimage sh -c "./init.sh && ./some-other-script.sh && echo 'about to start' && ./docker-entrypoint.sh"
如果命令中的最后一条指令是主应用程序,请记住使用
exec
,这样它将作为PID 1运行,并接收正确的SIGKILL和SIGTERM。例如:

docker run -d  nginx sh -c "./inject-my-vars.sh && exec nginx -g 'daemon off;'"
docker run -d  nginx sh -c "./inject-my-vars.sh && exec nginx -g 'daemon off;'"