yml tutorial sirve que para elastic docs cli aws amazon-web-services docker amazon-ec2 elastic-beanstalk

amazon-web-services - tutorial - laravel aws



¿Cómo personalizar el comando de ejecución del acoplador en Elastic Beanstalk? (3)

Aquí está la cosa, necesito decirle a Docker que no contamine las redes del contenedor, porque necesita conectarse a un MongoDB que está dentro de una VPN (base de datos privada de la empresa).

Hay un comando Docker que nos permite hacer exactamente eso: --net=host . Referencia here .

Entonces, por ejemplo, cuando ejecuto el contenedor en mi máquina local, haré algo como:

docker run --rm -it --net=host [image-name]:[version] bash -il

Y ese comando hará el truco. Gracias a eso, puedo conectarme al MongoDB "privado".

Entonces, mi pregunta es: ¿hay alguna manera de personalizar el comando de docker run de la --net=host docker run de un entorno de --net=host docker run única en Elastic Beanstalk para que pueda agregar el --net=host ?

He intentado usar los container_commands en el archivo config.yml para agregar esa instrucción allí, pero no creo que haga lo que necesito, aquí hay un fragmento:

container_commands: 00-test_command: command: bundle exec thin --net=host 01-networking-fix: command: "docker run --rm -it --net=host [image-name]:[version] bash -il"


Si bien el beanstalk elástico generalmente es adecuado para aplicaciones que funcionan con un conjunto de configuraciones estándar, es difícil personalizar y mantener las cosas actualizadas junto con las actualizaciones que AWS proporciona a las pilas de EB. Habiendo dicho eso, he hecho algo parecido a continuación, que es un poco raro, pero funciona bien.

files: "/opt/elasticbeanstalk/hooks/appdeploy/pre/04run.sh": mode: "000755" owner: root group: root encoding: plain content: | #script content of original 04run.sh along with modification on docker run cmd # eg. I injected multi-ports here docker run -d / "${EB_CONFIG_DOCKER_ENV_ARGS[@]}" / "${EB_CONFIG_DOCKER_VOLUME_MOUNTS[@]}" / "${EB_CONFIG_DOCKER_ENTRYPOINT_ARGS[@]}" / "${PORT_ARGS[@]}" / $EB_CONFIG_DOCKER_IMAGE_STAGING / "${EB_CONFIG_DOCKER_COMMAND_ARGS[@]}" 2>&1 | tee /tmp/docker_run.log | tee $EB_CONFIG_DOCKER_STAGING_APP_FILE

Esto no es muy limpio, al menos tengo que asegurarme de que no se rompa con las actualizaciones de beanstalk elástico. El anterior es para Docker 1.5 stack pero puedes hacer algo similar con la versión que estás ejecutando.


Tenga en cuenta que la última versión de la pila AWS (con Docker 1.7.1) tiene una configuración de implementación previa ligeramente diferente . Deberá actualizar el archivo en la ubicación: /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh

commands: 00001_add_privileged: cwd: /tmp command: ''sed -i "s/docker run -d/docker run --privileged -d/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh''

o, por ejemplo, si quiere pasar args a su imagen Docker:

commands: 00001_modify_docker_run: cwd: /tmp command: ''sed -i "s//$EB_CONFIG_DOCKER_IMAGE_STAGING//$EB_CONFIG_DOCKER_IMAGE_STAGING -gzip -enable-url-source/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh''


Terminé arreglando con dos comandos de contenedor

container_commands: 00_fix_networking: command: sed -i ''s/docker run -d/docker run --net=host -d/'' /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh 01_fix_docker_ip: command: sed -i ''s/server $EB_CONFIG_NGINX_UPSTREAM_IP/server localhost/'' /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh

Actualización : también tuve que arreglar el script Upstart. Desafortunadamente, no escribí lo que hice porque no terminé necesitando modificar el comando de docker run la docker run . Haría una directiva de files para (creo) /etc/init/docker . AWS edita la configuración de Nginx de la misma manera que en 01flip.sh en ese archivo también.

Explicación:

En la versión de 64bit Amazon Linux 2015.03 v2.0.2 running Docker 1.7.1 , el archivo que necesita editar es /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh . Este archivo ahora es mucho más complejo que la versión de Samar, así que no quería poner el contenido real allí. Sin embargo, el cambio es básicamente el mismo. Está la línea que comienza con

docker run -d

Lo arreglé con un comando contenedor:

container_commands: 00_fix_networking: command: sed -i ''s/docker run -d/docker run --net=host -d/'' /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh

Esto agrega con éxito el argumento --net=host pero ahora hay otro problema. El sistema termina con una directiva Nginx inválida. El uso de --net=host significa que cuando ejecuta el docker inspect <container id> no hay una dirección IP en NetworkSettings. AWS usa esto para crear la directiva del servidor para Nginx y termina generando el server :<some port you chose> (antes de agregar --net=host se vería como el server <ip>:<port> ). Necesitaba parchar ese archivo, también. Se genera en /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh .

01_fix_docker_ip: command: sed -i ''s/server $EB_CONFIG_NGINX_UPSTREAM_IP/server localhost/'' /opt/elasticbeanstalk/hooks/appdeploy/enact/01flip.sh