创建用于执行Ansible lint的Docker镜像

这篇文章是Ansible lint Advent Calendar 2022第七天的文章。

本次我们将解释如何构建一个执行Ansible lint的Docker镜像。代码示例如下。

为什么要创建Docker镜像?

pyenvやVirtualenvでセットアップした環境が比較的壊れやすい(異論はあるかと思います)

Red Hatが提供しているAnsible lintがインストールされたDockerイメージquay.io/ansible/creator-eeにAnsible Community Packageが入ってない

Asibleコンテンツの開発者が増えると同一バージョンのライブラリを開発者間のローカル環境で利用するのが難しくなる

如果对于使用creator-ee的形象没有问题的话,考虑到维护成本,我们认为最好使用那个选项。

然而,目前creator-ee的映像中尚未安装Ansible Community Package。因此,无法使用Ansible lint的所有功能,我认为这不切实际。

文件

使用下述文件。

    • Dockerfile

 

    requirements.txt
FROM python:3.11.0-slim-buster as builder

# Install required packages
RUN apt-get update \
  && mkdir -p /usr/share/man/man1 \
  && pip3 install --upgrade pip \
  && apt-get install -y \
    apt ca-certificates curl git locales openssh-client sudo unzip

# Copy requirements.txt
COPY requirements.txt /tmp/

# Install Ansible lint and Ansible
RUN pip3 install --no-cache-dir --no-compile -r /tmp/requirements.txt

FROM python:3.11.0-slim-buster as production

# Install required packages
RUN apt-get update \
  && mkdir -p /usr/share/man/man1 \
  && pip3 install --upgrade pip \
  && apt-get install -y git

COPY --from=builder /usr/local/lib/python3.11/site-packages/ /usr/local/lib/python3.10/site-packages/
COPY --from=builder /usr/local/bin/ansible-lint /usr/local/bin/ansible-lint
COPY --from=builder /usr/local/bin/ansible /usr/local/bin/ansible
COPY --from=builder /usr/local/bin/ansible-config /usr/local/bin/ansible-config
COPY --from=builder /usr/local/bin/ansible-connection /usr/local/bin/ansible-connection
COPY --from=builder /usr/local/bin/ansible-galaxy /usr/local/bin/ansible-galaxy
COPY --from=builder /usr/local/bin/ansible-playbook /usr/local/bin/ansible-playbook

# Remove caches
RUN find /usr/ -name '__pycache__' -print0 | xargs -0 -n1 rm -rf \
  && find /usr/ -name '*.pyc' -print0 | xargs -0 -n1 rm -rf

WORKDIR /data
ENTRYPOINT ["ansible-lint"]
ENV ANSIBLE_FORCE_COLOR='1' PY_COLORS='1'
CMD ["--version"]
ansible-lint==6.9.1
ansible==7.0.0

建立形象

将Dockerfile和requirements.txt文件放置在同一目录中,并使用以下命令进行构建。

docker build -t <image-name>:<tag> .

使用方法

在想要执行 Ansible lint 的目录中,运行以下命令。

$ docker run --rm -v $(pwd):/data <image-name>:<tag> <ファイル名>

# ディレクトリ全体
docker run --rm -v $(pwd):/data <image-name>:<tag> .

如果没有指定文件名,则会输出版本信息。

$ docker run --rm -v $(pwd):/data <image-name>:<tag>

ansible-lint 6.8.0 using ansible 2.13.6

简单解释

一定要安装Ansible。

使用pip3 install ansible-lint命令仅安装了Ansible lint,而没有安装Ansible core。这将导致在执行一些检查如deprecated-module或fqdn时无法获得正确的结果。务必安装Ansible(也被称为Ansible社区包)。

我们将使用python:slim-buster作为生产镜像。

也可以尝试在alpine上安装Python 3并进行轻量化,但根据我个人的测试,执行速度较慢。关于这个问题的详细解释可以在「适用于在工作中部署Python容器的Dockerfile(1):万能版」一文中找到,我将分享给大家。

采用多阶段构建以减小Docker镜像的大小。

最近很流行。可以让图像变得更轻量。

在环境变量中设置ANSIBLE_FORCE_COLOR=’1’和PY_COLORS=’1’来给日志显示添加颜色。

喜好不同。

Ansible Lint・将Ansible版本记录在requirements.yml中。

可以直接将它们写在Dockerfile中,但这取决于构建策略。例如,如果使用Dependabot,则需要使用requirements.yml文件。如果不需要版本控制(始终使用最新的Ansible lint和Ansible community package),则可以将安装步骤直接写在Dockerfile中。

FROM python:3.11.0-slim-buster as builder

# Install required packages
RUN apt-get update \
  && mkdir -p /usr/share/man/man1 \
  && pip3 install --upgrade pip \
  && apt-get install -y \
    apt ca-certificates curl git locales openssh-client sudo unzip

# Copy requirements.txt
COPY requirements.txt /tmp/

# Install Ansible lint and Ansible
RUN pip3 install --no-cache-dir --no-compile -r ansible-lint ansible

FROM python:3.11.0-slim-buster as production

# Install required packages
RUN apt-get update \
  && mkdir -p /usr/share/man/man1 \
  && pip3 install --upgrade pip \
  && apt-get install -y git

COPY --from=builder /usr/local/lib/python3.11/site-packages/ /usr/local/lib/python3.11/site-packages/
COPY --from=builder /usr/local/bin/ansible-lint /usr/local/bin/ansible-lint
COPY --from=builder /usr/local/bin/ansible /usr/local/bin/ansible
COPY --from=builder /usr/local/bin/ansible-config /usr/local/bin/ansible-config
COPY --from=builder /usr/local/bin/ansible-connection /usr/local/bin/ansible-connection
COPY --from=builder /usr/local/bin/ansible-galaxy /usr/local/bin/ansible-galaxy
COPY --from=builder /usr/local/bin/ansible-playbook /usr/local/bin/ansible-playbook

# Remove caches
RUN find /usr/ -name '__pycache__' -print0 | xargs -0 -n1 rm -rf \
  && find /usr/ -name '*.pyc' -print0 | xargs -0 -n1 rm -rf

WORKDIR /data
ENTRYPOINT ["ansible-lint"]
ENV ANSIBLE_FORCE_COLOR='1' PY_COLORS='1'
CMD ["--version"]
广告
将在 10 秒后关闭
bannerAds