compose_validatr/lib.rs
1//! `compose-validatr` is a library for validating and building valid [Docker Compose](https://docs.docker.com/compose/compose-file/) manifests that are not dependent on the host system.
2//!
3//! # Table of Contents
4//!
5//! - [High-level features](#high-level-features)
6//! - [Purpose](#purpose)
7//! - [Examples](#examples)
8//!
9//!
10//! # High-level Features
11//!
12//! - Create and validate a Docker Compose structure from `&str`
13//! - Access the fields for a Compose manifest
14//! - View multiple validation errors at once
15//!
16//! # Purpose
17//!
18//! The main purpose of this library is for building and validating Docker Compose manifests
19//! in contexts that are agnostic to a host machine. This is useful for web applications
20//! that want to visualize existing Compose manifests or create valid manifests without
21//! caring if host files or devices are present.
22//!
23//! # Examples
24//!
25//! ```rust
26//! use compose_validatr::Compose;
27//!
28//! let yaml = r#"
29//! services:
30//! gitlab:
31//! image: gitlab/gitlab-ce:latest
32//! container_name: gitlab
33//! hostname: gitlab
34//! restart: always
35//! build:
36//! context: .
37//! dockerfile: webapp.Dockerfile
38//! "#;
39//!
40//! let compose = Compose::new(yaml).unwrap();
41//! compose.services.keys().for_each(|service_name| println!("Service: {service_name}"));
42//! ```
43//!
44//! ```rust
45//! use compose_validatr::Compose;
46//!
47//! let yaml = r#"
48//! version: '3.9'
49//! services:
50//! gitlab:
51//! image: gitlab/gitlab-ce:latest
52//! container_name: gitlab
53//! hostname: gitlab
54//! restart: always
55//! depends_on:
56//! - postgres
57//! ports:
58//! - "8080:80"
59//! - "8443:443"
60//! - "8022:22"
61//! environment:
62//! GITLAB_ROOT_PASSWORD: eYPkjBbrtzX8eGVc
63//! DATABASE_URL: "postgres://gitlab:eYPkjBbrtzX8eGVc@postgres:5432/gitlab"
64//! volumes:
65//! - ./gitlab/config:/etc/gitlab
66//! - ./gitlab/logs:/var/log/gitlab
67//! - ./gitlab/data:/var/opt/gitlab
68//! shm_size: '256m'
69//!
70//! registry:
71//! image: registry:2
72//! container_name: registry
73//! hostname: registry
74//! ports:
75//! - "5000:5000"
76//! volumes:
77//! - registry:/var/lib/registry
78//!
79//! sonarqube:
80//! build:
81//! context: ./sonarqube_image
82//! container_name: sonarqube
83//! hostname: sonarqube
84//! restart: always
85//! ports:
86//! - "9000:9000"
87//! - "9092:9092"
88//! volumes:
89//! - sonarqube:/opt/sonarqube/data
90//! - sonarqube:/opt/sonarqube/logs
91//! - sonarqube:/opt/sonarqube/extensions
92//!
93//! jenkins:
94//! build:
95//! context: ./jenkins_image
96//! container_name: jenkins
97//! hostname: jenkins
98//! restart: always
99//! ports:
100//! - "9080:8080"
101//! - "50000:50000"
102//! volumes:
103//! - jenkins:/var/jenkins_home
104//! - jenkins-data:/var/jenkins_home
105//! - jenkins-docker-certs:/certs/client:ro
106//! environment:
107//! - JAVA_OPTS=-Djenkins.install.runSetupWizard=false
108//! - DOCKER_HOST=tcp://docker:2376
109//! - DOCKER_CERT_PATH=/certs/client
110//! - DOCKER_TLS_VERIFY=1
111//!
112//! jenkins-docker:
113//! image: docker:dind
114//! container_name: jenkins-docker
115//! hostname: docker
116//! privileged: true
117//! environment:
118//! - DOCKER_TLS_CERTDIR=/certs
119//! volumes:
120//! - /etc/docker/daemon.json:/etc/docker/daemon.json
121//! - jenkins-docker-certs:/certs/client
122//! - jenkins-data:/var/jenkins_home
123//! ports:
124//! - '2376:2376'
125//! command: --storage-driver overlay2
126//!
127//! postgres:
128//! image: postgres:latest
129//! container_name: postgres
130//! hostname: postgres
131//! restart: always
132//! ports:
133//! - "5432:5432"
134//! volumes:
135//! - postgres:/var/lib/postgresql/data
136//! environment:
137//! POSTGRES_DB: gitlab
138//! POSTGRES_USER: gitlab
139//! POSTGRES_PASSWORD: eYPkjBbrtzX8eGVc
140//!
141//! volumes:
142//! sonarqube:
143//! jenkins:
144//! jenkins-docker-certs:
145//! jenkins-data:
146//! postgres:
147//! registry:
148//!
149//! networks:
150//! default:
151//! driver: bridge
152//! "#;
153//!
154//! // Create a new `Compose` from the &str. This will return a Result<Compose, ValidationErrors>
155//! let compose = Compose::new(yaml);
156//! match &compose {
157//! Ok(c) => {
158//! // Compose is valid. A lot of Compose fields are optional, so maps are very useful here
159//! c.version.as_ref().map(|v| println!("Version: {v}"));
160//! ()
161//! }
162//! Err(errors) => {
163//! // Compose had one or many errors
164//! ()
165//! }
166//! }
167//! ```
168
169#![warn(
170 clippy::all,
171 clippy::todo,
172 clippy::empty_enum,
173 clippy::inefficient_to_string,
174 clippy::str_to_string,
175 clippy::str_to_string,
176 clippy::missing_docs
177)]
178#![deny(unreachable_pub, unreachable_code, unsafe_code)]
179pub mod compose;
180pub mod configs;
181pub mod errors;
182pub mod networks;
183pub mod secrets;
184pub mod services;
185pub mod volumes;
186
187pub use crate::compose::Compose;