2016-09-08 1 views
1

J'ai un Dockerfile semblable à celui-ci:Docker pour le développement et la production

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

Je voudrais pouvoir l'utiliser dans la production après avoir fait tous les tests et le développement. Pendant le développement, j'aimerais utiliser JRebel et activer le débogage, de préférence sans apporter de modifications au Dockerfile ou en avoir besoin d'un supplémentaire. To use JRebel malheureusement, les jrebel.jar doit faire partie du conteneur/image et JAVA_OPTS doivent être améliorés avec:

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

De plus, le debuggin tomcat doit être activé avec:

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

Est-il possible d'avoir un Dockerfile et ensuite via les options d'exécution ou quelque chose comme ça permettent les options de développement dont j'ai besoin? Quelle serait une option réalisable pour avoir une image docker "productive" qui peut être utilisée pour exécuter un conteneur pendant le développement?

Répondre

1

puis via des options d'exécution ou quelque chose comme ça qui permet les options de développement dont j'ai besoin?

En tant que possible « option d'exécution », vous pouvez utiliser une variable d'environnement que vous définissez sur le docker run command (ou docker-compose 'environment' directive).

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

Ensuite, vous pouvez avoir votre image, utilisez un script qui adapte les options JAVA_OPTS ou tomcat, selon $ENV.

Si $ENV n'est pas défini, ou défini et est égal à tout sauf "dev", alors vous n'activez pas les options de débogage.

1

La méthode standard consiste à spécifier une commande différente lorsque vous démarrez votre conteneur. Vous pouvez remplacer à la fois ENTRYPOINT et CMD.

docker run -d --entrypoint "[]" myimage sh -c "./init.sh && ./some-other-script.sh && echo 'about to start' && ./docker-entrypoint.sh" 

Si la dernière instruction de votre commande est l'application principale, pensez à utiliser exec afin qu'il fonctionnera comme PID 1 et recevoir le SIGKILL approprié et SIGTERM. Exemple:

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