container: support bind mounted db data directory and mysql config

This commit is contained in:
uumas
2023-04-21 07:44:23 +03:00
parent 20e38332e6
commit 079b008111
7 changed files with 79 additions and 21 deletions

View File

@@ -2,5 +2,6 @@
docker_host_user: false
docker_volume_type: named
docker_mariadb_config: {}
timezone: Etc/UTC

View File

@@ -37,6 +37,19 @@ argument_specs:
description: "database_passwords[docker_service] is a string with the password used for communication between the service and database. Required if docker_database is postgres or mariadb"
type: dict
required: false
docker_mariadb_config:
description: |
A dict specifying config for mariadb. For example
mysqld:
innodb_buffer_pool_size: '4G'
aria_pagecache_buffer_size': '4G'
would set
[mysqld]
innodb_buffer_pool_size = 4G
aria_pagecache_buffer_size = 4G
type: dict
required: false
default: {}
docker_additional_services:
description: "List of additional services to configure (in separate containers). These will be accessible with hostname <docker_service_name>[_suffix]_<additional_service>"
type: list

View File

@@ -28,6 +28,39 @@
db_container_data: /data/db
when: docker_database == 'mongo'
- name: Reset db container mount definition var
set_fact:
db_container_mount_definition: []
- name: Set up database container data bind mount
when: docker_volume_type == 'bind'
block:
- name: Create db data bind mount directory for {{ docker_service_name }}
file:
path: "{{ docker_mounts_dir }}/db"
state: directory
- name: Set db_container_mount_definition for db data bind mount
set_fact:
db_container_mount_definition: "{{ db_container_mount_definition + [{'source': docker_mounts_dir + '/db', 'target': db_container_data, 'type': 'bind'}] }}"
- name: Set up database container config bind mount
when: db_config_mounts_needed
block:
- name: Put mariadb config in place
template:
src: mariadb.cnf.j2
dest: "{{ docker_mounts_dir }}/mariadb.cnf"
- name: Set db_container_mount_definition for db config bind mount
set_fact:
db_container_mount_definition: "{{ db_container_mount_definition + [{'source': docker_mounts_dir + '/mariadb.cnf', 'target': '/etc/mysql/conf.d/custom.cnf', 'type': 'bind', 'read_only': true}] }}"
- name: Set db_container_mount_definition for db data named volume
set_fact:
db_container_mount_definition: "{{ db_container_mount_definition + [{'source': docker_service_name + '_db', 'target': db_container_data, 'type': 'volume'}] }}"
when: docker_volume_type == 'named'
- name: Set db published ports var
set_fact:
db_published_ports: ["127.0.0.1:{{ ports[docker_service_name].db }}:{{ db_image_port }}"]
@@ -41,8 +74,6 @@
env: "{{ db_container_env | default(omit) }}"
published_ports: "{{ db_published_ports | default(omit) }}"
restart_policy: always
mounts:
- source: "{{ docker_service_name + '_db' }}"
target: "{{ db_container_data }}"
mounts: "{{ db_container_mount_definition }}"
networks: "{{ container_networks | default(omit) }}"
log_driver: local

View File

@@ -13,14 +13,15 @@
template_mounts_needed: "{{ docker_mounts | selectattr('template', 'defined') | list | length > 0 }}"
volumes_needed: "{{ docker_mounts | selectattr('name', 'defined') | list | length > 0 }}"
dockerfile_needed: "{{ dockerfile is defined and dockerfile | length > 0 }}"
db_config_mounts_needed: "{{ docker_mariadb_config | length > 0 }}"
- name: Set more assistive variables
set_fact:
bind_volumes_needed: "{{ volumes_needed and docker_volume_type == 'bind' }}"
named_volumes_needed: "{{ volumes_needed and docker_volume_type == 'named' }}"
- name: Set even more assistive variables
set_fact:
create_opt_directory: "{{ dockerfile_needed or docker_host_user or bind_volumes_needed or template_mounts_needed }}"
create_mounts_directory: "{{ bind_volumes_needed or template_mounts_needed }}"
create_opt_directory: "{{ dockerfile_needed or docker_host_user or bind_volumes_needed or template_mounts_needed or db_config_mounts_needed }}"
create_mounts_directory: "{{ bind_volumes_needed or template_mounts_needed or db_config_mounts_needed }}"
- name: Set docker service full name
set_fact:

View File

@@ -24,10 +24,6 @@
include_tasks: proxy.yml
when: reverse_proxy_type != 'none'
- name: Database container
include_tasks: database.yml
when: docker_database != 'none'
- name: Additional services
when: docker_additional_services is defined
block:
@@ -74,6 +70,25 @@
container_workdir: /opt/{{ docker_service }}
when: docker_service_suffix is not defined
- name: Create mounts directory
when: create_mounts_directory
block:
- name: Set docker_mounts_dir
set_fact:
docker_mounts_dir: "{{ container_workdir }}/mounts"
- name: Create directory {{ docker_mounts_dir }}
file:
path: "{{ docker_mounts_dir }}"
state: directory
owner: "{{ user.uid | default(omit) }}"
group: "{{ user.group | default(omit) }}"
mode: 0700
- name: Database container
include_tasks: database.yml
when: docker_database != 'none'
- name: Container volumes
import_tasks: volumes.yml

View File

@@ -3,18 +3,7 @@
- name: Create directories and put files in them
when: create_mounts_directory
block:
- name: Set docker_mounts_dir
set_fact:
docker_mounts_dir: "{{ container_workdir }}/mounts"
- name: Create directory {{ docker_mounts_dir }}
file:
path: "{{ docker_mounts_dir }}"
state: directory
owner: "{{ user.uid | default(omit) }}"
group: "{{ user.group | default(omit) }}"
mode: 0700
- name: Define mounts directory owner
- name: Define mount directory owner
set_fact:
mount_owner: "{{ user.uid if docker_host_user else image_user | default('') }}"
mount_group: "{{ user.group if docker_host_user else '' }}"

View File

@@ -0,0 +1,8 @@
# {{ ansible_managed }}
{% for section in docker_mariadb_config | dict2items %}
[{{ section.key }}]
{% for item in section.value | dict2items %}
{{ item.key }} = {{ item.value }}
{% endfor %}
{% endfor %}