Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Manejando Docker containers con Ruby y backticks

Manejando Docker containers con Ruby y backticks

Cómo usar Ruby para ejecutar comandos de shell directamente en containers de Docker.

Gustavo Leon

August 19, 2016
Tweet

More Decks by Gustavo Leon

Other Decks in Programming

Transcript

  1. Manejando Docker containers
    con Ruby y backticks
    Ejecutando comandos en Ruby

    View Slide

  2. @hpneo
    • 26 años
    • Desarrollador Ruby desde 2011
    • CTO en CodePicnic desde 2015
    • #6 en Ruby en Perú, según
    GitHub Awards

    View Slide

  3. Ejecutando comandos en Ruby
    Backticks, %x, system y exec

    View Slide

  4. Backticks (``)
    • Es la forma más sencilla de
    ejecutar comandos.
    • Devuelve el resultado del
    comando ejecutado en forma de
    cadena.
    • Permite interpolar cadenas.
    files = `ls`
    # =>
    "Capfile\nGemfile\nGemfile.lock\nREA
    DME.md\nREADME.rdoc\nRakefile\napp\n
    bin\nconfig\nconfig.ru\ncontainer_po
    rts\ncontainer_ssl\ndb\ndoc\ndocker\
    ngulpfile.js\nicons.pxm\nlib\nlog\nm
    ain_files\nmodels\npem\npublic\nscri
    pt\nsharejs.js\nssl\ntest\ntmp\nupst
    art_service\nvendor\nvhost\n"

    View Slide

  5. %x
    • Hace lo mismo que los backticks,
    pero usa delimitadores al igual
    que %q o %w.
    • Así como los backticks, permite
    interpolar cadenas.
    directory = 'app'
    files = %x{ls #{directory}}
    # =>
    "admin\nassets\nchannels\nc
    ontrollers\nhelpers\njobs\n
    mailers\nmodels\nserializer
    s\nviews\nworkers\n"

    View Slide

  6. system
    • Ejecuta el comando pero solo
    retorna true si se ejecutó
    correctamente o false si da
    error.
    directory = 'app'
    files = system("ls
    #{directory}")
    # …
    # => true

    View Slide

  7. exec
    • Ejecuta el comando y reemplaza
    el proceso actual por el proceso
    generado por el comando.
    • Con exec se termina la
    ejecución de Ruby e imprime el
    resultado del comando.
    directory = 'app'
    files = exec("ls
    #{directory}")
    # …

    View Slide

  8. CodePicnic ❤ Docker
    ¿Qué es Docker y cómo lo usamos?

    View Slide

  9. Docker
    • Es una plataforma que permite
    correr máquinas virtuales ligeras
    (llamados containers o
    contenedores).
    • Podemos usarlo para levantar
    ambientes de desarrollo,
    pruebas o producción.

    View Slide

  10. Docker
    • Podemos crear imágenes en un
    momento determinado y crear
    miles de copias a partir de ese
    punto en el tiempo.
    • También podemos crear
    imágenes a partir de recetas,
    llamadas Dockerfiles.

    View Slide

  11. Docker
    • Docker tiene un comando,
    llamado docker, que permite
    controlar las imágenes y
    contenedores que existen en
    nuestra máquina.

    View Slide

  12. Docker en CodePicnic
    • CodePicnic permite crear
    pequeñas máquinas virtuales
    (llamadas consolas) utilizando
    Docker, para editar y ejecutar
    código desde el navegador.

    View Slide

  13. Docker en CodePicnic
    • Cada consola tiene una interfaz
    gráfica con un sidebar con
    archivos, un editor de código y
    una terminal conectada a su
    propio contenedor de Docker.

    View Slide

  14. Docker en CodePicnic
    • Para integrar las consolas con
    sus respectivos contenedores
    necesitamos utilizar la API de
    Docker en sus dos formas: REST
    API y el comando docker.

    View Slide

  15. Iniciar un contenedor
    system("docker start #{@container_name}")

    View Slide

  16. Detener un contenedor
    system("docker stop #{@container_name}")

    View Slide

  17. Obtener el estado de un contenedor
    state = `docker inspect -f '{{json .State}}'
    #{@container_name}`.chomp
    JSON.parse(state)

    View Slide

  18. Listar archivos dentro de un contenedor con sus
    MIME types
    files_list = `docker exec -i #{@container_name}
    bash -c 'cd "/app/#{@path}" && ls -A1 >
    /tmp/file.txt && file --mime-type -f
    /tmp/file.txt -F ":"' `

    View Slide

  19. Ejecutar un comando dentro de un contenedor
    output = `docker exec -i #{@container_name} bash
    -c 'ls "#{@path}"'`

    View Slide

  20. ¡Gracias!
    [email protected]
    github.com/hpneo
    github.com/CodePicnic

    View Slide