Docker 用于开发和生产
Docker for development and production
我有一个 Dockerfile
类似于这个:
FROM tomcat:7-jre8-alpine
...
ENTRYPOINT ["sh", "docker-entrypoint.sh"]
我希望在完成所有测试和开发后能够在生产中使用它。在开发过程中,我想使用 JRebel 并激活调试,最好不要更改 Dockerfile 或需要一个额外的文件。 To use JRebel 不幸的是,jrebel.jar
需要成为 container/image 的一部分,并且 JAVA_OPTS
需要增强:
"-javaagent:/jrebel.jar -Drebel.remoting_plugin=true"
还必须启用 tomcat 调试:
"-agentlib:jdwp=transport=dt_socket, address=1043, server=y, suspend=n"
是否可以有一个 Dockerfile
然后通过 运行 选项或类似的东西启用我需要的开发选项?有一个 "productive" docker 图像可以在开发期间用于 运行 容器的可行选项是什么?
then via run options or something like that enable the development options I need?
作为一种可能 "run option",您可以使用在 docker run
command (or the docker-compose
'environment
' directive) 上定义的环境变量。
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;'"
我有一个 Dockerfile
类似于这个:
FROM tomcat:7-jre8-alpine
...
ENTRYPOINT ["sh", "docker-entrypoint.sh"]
我希望在完成所有测试和开发后能够在生产中使用它。在开发过程中,我想使用 JRebel 并激活调试,最好不要更改 Dockerfile 或需要一个额外的文件。 To use JRebel 不幸的是,jrebel.jar
需要成为 container/image 的一部分,并且 JAVA_OPTS
需要增强:
"-javaagent:/jrebel.jar -Drebel.remoting_plugin=true"
还必须启用 tomcat 调试:
"-agentlib:jdwp=transport=dt_socket, address=1043, server=y, suspend=n"
是否可以有一个 Dockerfile
然后通过 运行 选项或类似的东西启用我需要的开发选项?有一个 "productive" docker 图像可以在开发期间用于 运行 容器的可行选项是什么?
then via run options or something like that enable the development options I need?
作为一种可能 "run option",您可以使用在 docker run
command (or the docker-compose
'environment
' directive) 上定义的环境变量。
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;'"