我有一个类似的Dockerfile
:
FROM tomcat:7-jre8-alpine
...
ENTRYPOINT ["sh", "docker-entrypoint.sh"]
我希望在完成所有测试和开发后能够在生产中使用它。在开发过程中,我希望使用JRebel并激活调试,最好不要更改Dockerfile或需要额外的Dockerfile。不幸的是,要使用JRebel, jrebel.jar
需要成为容器/映像的一部分,JAVA_OPTS
需要使用以下命令增强:
"-javaagent:/jrebel.jar -Drebel.remoting_plugin=true"
还必须启用tomcat调试:
"-agentlib:jdwp=transport=dt_socket, address=1043, server=y, suspend=n"
是否有可能有一个Dockerfile
,然后通过运行选项或类似的东西,使我需要的开发选项?在开发过程中使用可用于运行容器的"生产性"docker映像是一个可行的选择吗?
然后通过运行选项或类似的东西启用我需要的开发选项?
作为一个可能的"运行选项",您可以使用您在docker run
命令(或docker-compose
' environment
'指令)上定义的环境变量。
docker run -e "env=dev" ...
然后,您可以让您的图像使用一个脚本来适应JAVA_OPTS
或tomcat选项,具体取决于$ENV
。
如果没有定义$ENV
,或者定义了并且不等于" dev
",则不激活调试选项
典型的方法是在启动容器时指定一个不同的命令。您可以覆盖ENTRYPOINT和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;'"