#+TITLE: Docker layer

#+TAGS: layer|tool

[[file:img/docker.png]]

* Table of Contents                     :TOC_5_gh:noexport:
- [[#description][Description]]
  - [[#features][Features:]]
- [[#install][Install]]
  - [[#docker][Docker]]
  - [[#linting][Linting]]
  - [[#lsp][LSP]]
- [[#usage][Usage]]
  - [[#tramp-access-to-docker-containers][TRAMP access to docker containers]]
- [[#key-bindings][Key bindings]]

* Description
This layer integrates basic container management into Spacemacs.

** Features:
- Syntax highlighting for =Docker= files
- =Docker= build integration
- =TRAMP= access to running Docker containers
- =Docker= container and image management via [[https://github.com/Silex/docker.el][docker.el]]
- =docker-compose= integration via [[https://github.com/Silex/docker.el][docker.el]]
- Syntax checking via [[https://github.com/hadolint/hadolint][hadolint]]
- Code-Completion via =lsp=

* Install
** Docker
To use this configuration layer, add it to your =~/.spacemacs=. You will need to
add =docker= to the existing =dotspacemacs-configuration-layers= list in this
file.

You will also need the native package [[https://www.docker.com/][Docker]] for the actual container management.

** Linting
For syntax checking the external library [[https://github.com/hadolint/hadolint][hadolint]] is necessary.
It can either be downloaded from [[https://github.com/hadolint/hadolint/releases/latest][=here=]] or
build locally with stack as shown below:

#+BEGIN_SRC sh
  stack install hadolint
#+END_SRC

** LSP
This layer can be enhanced with [[https://github.com/rcjsuen/dockerfile-language-server-nodejs][=dockerfile-language-server-nodejs=]] and emacs
[[https://github.com/emacs-lsp/lsp-mode][=lsp-mode=]] to provide richer, IDE-like capabilities.
To do so set the layer variable =docker-dockerfile-backend= to =lsp= like shown below:

#+BEGIN_SRC emacs-lisp
  (setq-default dotspacemacs-configuration-layers
                '((docker :variables docker-dockerfile-backend 'lsp)))
#+END_SRC

In addition you need to install the lsp server's executable in your system.
This can be done via npm:

#+BEGIN_SRC sh
  npm i -g dockerfile-language-server-nodejs
#+END_SRC

* Usage
** TRAMP access to docker containers
This relies on the [[https://github.com/emacs-pe/docker-tramp.el][docker-tramp]] package which uses =docker exec= available in
docker versions > 1.3.

=docker-tramp= adds a new prefix =/docker:= that you can use with ~SPC f f~,
this prefix allows to access your docker containers and also provides
auto-completion of the running containers.

* Key bindings

| Key binding | Description                                                       |
|-------------+-------------------------------------------------------------------|
| ~SPC a t d~ | entry point to interact with dockers, after that use ~?~ for help |
| ~SPC m b~   | build current buffer                                              |
| ~SPC m B~   | build current buffer without cache                                |
| ~SPC m d~   | shortcut for ~docker.el~ main menu                                |
| ~SPC m i~   | shortcut for 'docker images' in the ~docker.el~ screen            |
| ~SPC m p~   | shortcut for 'docker containers' in the ~docker.el~ screen        |
