Docker用于开发和生产

时间:2016-09-08 10:53:40

标签: tomcat docker docker-compose dockerfile jrebel

我有Dockerfile与此类似:

FROM tomcat:7-jre8-alpine
...
ENTRYPOINT ["sh", "docker-entrypoint.sh"]

我希望能够在完成所有测试和开发后在生产中使用它。在开发过程中,我想使用JRebel并激活调试,最好不要更改Dockerfile或需要额外的一个。 To use JRebel遗憾的是,jrebel.jar需要成为容器/图片的一部分,而JAVA_OPTS需要通过以下方式加强:

"-javaagent:/jrebel.jar -Drebel.remoting_plugin=true"

还必须使用以下命令启用tomcat debuggin:

"-agentlib:jdwp=transport=dt_socket, address=1043, server=y, suspend=n"

是否可以有一个Dockerfile然后通过运行选项或类似的东西启用我需要的开发选项?在开发过程中有一个可以用来运行容器的“高效”docker镜像会是一个可行的选择吗?

2 个答案:

答案 0 :(得分:1)

  

然后通过运行选项或类似的东西启用我需要的开发选项?

作为可能的"运行选项",您可以使用您在docker run command(或docker-compose 'environment' directive)上定义的环境变量。

 docker run -e "env=dev" ...

然后,您可以让您的图像使用适合JAVA_OPTS或tomcat选项的脚本,具体取决于$ENV

如果$ENV未定义,或已定义且等于" dev"以外的任何内容,则您不会激活调试选项。

答案 1 :(得分:1)

典型的方法是在启动容器时指定其他命令。您可以覆盖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;'"