DEV Community

Eduardo | DevOps
Eduardo | DevOps

Posted on • Edited on

Hadolint: AST para Dockerfile

Hadolint é uma ferramenta interessante para realizar linter de arquivos Dockerfile. Preza pelas boas práticas e faz, inclusive, de shell bash incluído no Dockerfile. Um pequeno exemplo aqui abaixo usando o hadolint instalado diretamente pelo brew e usando imagem de contêiner.

Exemplo de Dockerfile:

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
Enter fullscreen mode Exit fullscreen mode
$ brew install hadolint

$ hadolint Dockerfile

Dockerfile:6 DL3018 warning: Pin versions in apk add. Instead of `apk add <package>` use `apk add <package>=<version>`
Enter fullscreen mode Exit fullscreen mode

O exemplo acima, pede para que seja discriminado a versão do pacote ao invés de usar a versão latest dos binários.

É possível ignorar esta mensagem usando --ignore:

$ hadolint --ignore DL3018  Dockerfile

Enter fullscreen mode Exit fullscreen mode

Usando Docker:

$docker run --rm -i ghcr.io/hadolint/hadolint < Dockerfile

Enter fullscreen mode Exit fullscreen mode

Para ignorar nas imagens docker, basta incluir uma linha com comentário com código de erro:

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0

# hadolint ignore=DL3018
# hadolint ignore=DL3006,3013 (e demais separados por vírgulas)

RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
Enter fullscreen mode Exit fullscreen mode

Repita o comando:

$ docker run --rm -i ghcr.io/hadolint/hadolint < Dockerfile
Enter fullscreen mode Exit fullscreen mode

Saiba mais em: https://githubhelp.com/hadolint/hadolint

hadolint

Top comments (0)