创建用于执行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"]