让我们解释一下Molecule的Docker驱动程序
我将解释Molecule Docker Plugin,它是Molecule的Docker驱动程序。
Docker驱动程序是什么?
Molecule的Docker驱动程序是Molecule连接到Docker容器的处理助手。它通过简洁的molecule.yml描述,创建测试环境容器并在测试结束后销毁该容器。
内部主要使用了”community.docker.docker_container”和”community.docker.docker_network”。
除了从外部容器注册表获取Docker镜像的”community.docker.docker_login”之外,还采用了”community.docker.docker_image”来从Dockerfile构建镜像。
此外,容器始终以detached模式运行。目前似乎无法更改。
Docker驱动程序执行的操作
Docker驱动程序的处理定义位于 GitHub 存储库的 src/molecule_docker/playbooks/* 中。处理由存放在这里的Playbook文件执行。此外,如果要向这些Playbook传递变量,主要是在 molecule.yml 的 platform 部分进行记录。
需要注意的是,Docker驱动程序并不可以在”community.docker.docker_container”和”community.docker.docker_network”等模块中设置所有可用参数。您需要仔细查看src/molecule_docker/playbooks/*的定义文件以了解可以设置的参数。
在使用Docker驱动程序时,主要使用的参数
基本上,我们将基于”community.docker.docker_container”的参数进行说明,但本次只讲解 Docker 驱动中常用的基本参数。
环境
设置环境变量。您可以传递云的认证信息、SSH密钥等机密信息。当启动数据库容器时,您仍然可以传递用户名、密码等信息。
图像
可以设置Docker镜像容器存储库的URI。并且还可以从私有存储库中获取Docker镜像。
名字
Molecule是启动Docker容器的名称。作为Docker的特性,如果要启动多个容器,就不能启动同名的容器。如果要启动多个测试用容器,建议使用唯一的名称。
网络模式
可以指定Docker的网络模式。如果不指定,默认情况下会设置为bridge模式。
预先构建图像
如果想要在启动容器后配置Ansible可连接的环境,请将其设置为true。
即使启动一个没有安装Python的镜像,Ansible也无法连接到容器。如果将pre_build_image设置为true,那么对于启动的容器,将安装Python和其他必要的处理,从而使Ansible可以连接到容器。
对于支持pre_build_image的容器,这些容器在GitHub存储库的src/molecule_docker/playbooks/Dockerfile.j2文件中定义。根据处理内容来看,目前似乎只支持Linux容器。
# Molecule managed
{% if item.registry is defined %}
FROM {{ item.registry.url }}/{{ item.image }}
{% else %}
FROM {{ item.image }}
{% endif %}
{% if item.env is defined %}
{% for var, value in item.env.items() %}
{% if value %}
ENV {{ var }} {{ value }}
{% endif %}
{% endfor %}
{% endif %}
RUN if [ $(command -v apt-get) ]; then export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get install -y python3 sudo bash ca-certificates iproute2 python3-apt aptitude && apt-get clean && rm -rf /var/lib/apt/lists/*; \
elif [ $(command -v dnf) ]; then dnf makecache && dnf --assumeyes install /usr/bin/python3 /usr/bin/python3-config /usr/bin/dnf-3 sudo bash iproute && dnf clean all; \
elif [ $(command -v yum) ]; then yum makecache fast && yum install -y /usr/bin/python /usr/bin/python2-config sudo yum-plugin-ovl bash iproute && sed -i 's/plugins=0/plugins=1/g' /etc/yum.conf && yum clean all; \
elif [ $(command -v zypper) ]; then zypper refresh && zypper install -y python3 sudo bash iproute2 && zypper clean -a; \
elif [ $(command -v apk) ]; then apk update && apk add --no-cache python3 sudo bash ca-certificates; \
elif [ $(command -v xbps-install) ]; then xbps-install -Syu && xbps-install -y python3 sudo bash ca-certificates iproute2 && xbps-remove -O; fi
特权
通过权限模式启动Docker容器。
根据用途进行使用调整。若使用systemd等服务,则将其设置为privileged: true。
如果不使用systemd进行处理,就不需要启用它。
其他
如果您正在使用Gitlab、Jenkins等托管型的持续集成工具,可能有时想要针对每个测试场景对容器的CPU、内存、块IO等资源进行限制。
用途分类样品
不使用systemd和网络
这将是最简单的设置。
---
dependency:
name: galaxy
driver:
name: docker
platforms:
- name: instance
image: ${MOLECULE_IMAGE}
provisioner:
name: ansible
verifier:
name: ansible
scenario:
test_sequence:
- dependency
- syntax
- create
- converge
- verify
样本仓库
- ansible-roles-mamono210/cowsay | GitHub
我們使用systemd,但不使用網絡。
(Note: “systemd” refers to a system and service manager in Linux operating systems)
命令:将/sbin/init、privileged:True。其中的/sbin/init部分可能因Docker镜像而异。
---
dependency:
name: galaxy
driver:
name: docker
platforms:
- name: instance
image: ${MOLECULE_IMAGE}
command: /sbin/init
privileged: True
provisioner:
name: ansible
verifier:
name: ansible
scenario:
test_sequence:
- dependency
- syntax
- create
- converge
- verify
样本库 kù)
- ansible-roles-mamono210/vnc_server | GitHub
使用港口
请在命令中设置所需的参数,并在exposed_ports、published_ports中设置需要在测试处理中开放的端口。
如果只是安装Ansible库或其他内容,不需要打开端口。但是如果想要在Molecule中执行动态测试,需要打开端口。
---
dependency:
name: galaxy
driver:
name: docker
platforms:
- name: instance
image: ${MOLECULE_IMAGE}
docker_host: "${DOCKER_HOST:-unix://var/run/docker.sock}"
command:
- '/sbin/init'
- '--web.enable-lifecycle'
- '--config.file=/etc/prometheus/prometheus.yml'
privileged: True
exposed_ports:
- 9100/tcp
- 9090/tcp
published_ports:
- 0.0.0.0:9100:9100/tcp
- 0.0.0.0:9090:9090/tcp
provisioner:
name: ansible
verifier:
name: ansible
scenario:
test_sequence:
- syntax
- create
- converge
- verify
示例代码库
- ansible-roles-mamono210/prometheus | GitHub
建立网络,将容器加入网络。
目前情况下,Docker驱动程序无法处理该请求。
根据GitHub存储库src/molecule_docker/playbooks/*中的Docker驱动程序处理定义文件来看,只考虑了单个容器的启动和销毁,因此如果要使用多个容器,必须使用delegated驱动程序。
使用委派驱动程序时,在使用Docker网络功能时要注意Docker资源的创建顺序。通常情况下,
-
- Docker网络
-
- 数据库容器
- 应用容器
这是顺序。
削除順序相反
-
- 应用容器
-
- 数据库容器
- Docker网络
可能是好的吧。
当将Docker容器的配置集中在molecule.yml上时,便于日后查看时更加清晰易懂。
这个问题纯属个人喜好。
---
dependency:
name: galaxy
driver:
name: delegated
platforms:
- name: wordpress
image: ${MOLECULE_IMAGE}
command: /sbin/init
detach: yes
networks:
- name: molecule_wordpress
privileged: yes
ports:
- "80:80"
state: started
tty: yes
- name: db
image: mysql:5.7
networks:
- name: molecule_wordpress
state: started
env:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
- name: selenium
image: selenium/standalone-firefox:latest
networks:
- name: molecule_wordpress
ports:
- "4444:4444"
state: started
provisioner:
name: ansible
config_options:
defaults:
callbacks_enabled: ansible.posix.profile_tasks
connection_options:
wp_host: 'wordpress'
php_packages:
- php
- php-gd
- php-gmp
- php-intl
- php-ldap
- php-mbstring
- php-mcrypt
- php-mysqlnd
- php-opcache
- php-pdo
- php-pear
- php-pear-Net-Curl
- php-pecl-apcu-bc
- php-pecl-redis
- php-pecl-zip
- php-soap
- php-xml
verifier:
name: ansible
scenario:
converge_sequence:
- converge
destroy_sequence:
- destroy
test_sequence:
- dependency
- syntax
- create
- converge
- verify
- destroy
---
- name: Create
hosts: localhost
connection: local
tasks:
- name: set_fact molecule_platforms
ansible.builtin.set_fact:
molecule_platforms: "{{ molecule_yml.platforms }}"
- name: Create a network
community.docker.docker_network:
name: "{{ molecule_platforms.0.networks[0].name }}"
- name: Setup MySQL container
community.docker.docker_container:
name: "{{ molecule_platforms.1.name }}"
image: "{{ molecule_platforms.1.image }}"
networks:
- name: "{{ molecule_platforms.1.networks[0].name }}"
state: "{{ molecule_platforms.1.state }}"
env:
MYSQL_ROOT_PASSWORD: "{{ molecule_platforms.1.env.MYSQL_ROOT_PASSWORD }}"
MYSQL_DATABASE: "{{ molecule_platforms.1.env.MYSQL_DATABASE }}"
MYSQL_USER: "{{ molecule_platforms.1.env.MYSQL_USER }}"
MYSQL_PASSWORD: "{{ molecule_platforms.1.env.MYSQL_PASSWORD }}"
- name: Setup WordPress container
community.docker.docker_container:
name: "{{ molecule_platforms.0.name }}"
command: "{{ molecule_platforms.0.command }}"
detach: "{{ molecule_platforms.0.detach }}"
image: "{{ molecule_platforms.0.image }}"
networks:
- name: "{{ molecule_platforms.0.networks[0].name }}"
privileged: "{{ molecule_platforms.0.privileged }}"
ports:
- "{{ molecule_platforms.0.ports[0] }}"
state: "{{ molecule_platforms.0.state }}"
tty: "{{ molecule_platforms.0.tty }}"
- name: Setup Selenium container
community.docker.docker_container:
name: "{{ molecule_platforms.2.name }}"
image: "{{ molecule_platforms.2.image }}"
networks:
- name: "{{ molecule_platforms.2.networks[0].name }}"
ports:
- "{{ molecule_platforms.2.ports[0] }}"
state: "{{ molecule_platforms.2.state }}"
---
- name: Destroy
hosts: localhost
connection: local
tasks:
- name: set_fact molecule_platforms
ansible.builtin.set_fact:
molecule_platforms: "{{ molecule_yml.platforms }}"
- name: Remove Selenium container
community.docker.docker_container:
name: "{{ molecule_platforms.2.name }}"
state: absent
- name: Remove WordPress container
community.docker.docker_container:
name: "{{ molecule_platforms.0.name }}"
state: absent
- name: Remove MySQL container
community.docker.docker_container:
name: "{{ molecule_platforms.1.name }}"
state: absent
- name: Delete a network
community.docker.docker_network:
name: "{{ molecule_platforms.0.networks }}"
state: absent
force: yes
范例储存库
- ansible-roles-mamono210/wordpress_insall | GitHub
总结
如果容器的网络结构比较简单,那么积极采用Docker驱动程序可能会有好处。
如果网络很复杂,就采用委托驱动程序来编写create.yml和destroy.yml文件中启动/删除网络和容器的过程。
相关文章
- Moleculeテスト環境用のDockerゴールデンイメージを作成する – Qiita