2015-07-29 16:07:51 +02:00
|
|
|
# Package-Centric Source-Based Container Build System
|
|
|
|
|
2015-07-29 16:22:50 +02:00
|
|
|
## Reasons
|
2015-07-29 16:07:51 +02:00
|
|
|
* There's no standardized way to create container images that include
|
|
|
|
applications built from upstream sources.
|
|
|
|
* Application dependencies, which typically are libraries, are typically
|
|
|
|
neglected when calculating container dependencies. This causes not knowing
|
|
|
|
what libraries are installed
|
|
|
|
* Ad-Hoc source builds are time consuming
|
|
|
|
|
2015-07-29 16:22:50 +02:00
|
|
|
## Goals
|
2015-07-29 16:07:51 +02:00
|
|
|
* Fast source builds with lots of packages available
|
|
|
|
* Ad-Hoc source builds if required but defaulting to binary repository
|
|
|
|
* Reproducible and shareable builds
|
|
|
|
* Customized Source configuration flags
|
|
|
|
* Container dependencies reflect dependencies of container applications
|
|
|
|
* Easy assembling and configuring of containers based on application packages
|
|
|
|
* Integrable with CI
|
|
|
|
* Portable
|
|
|
|
|
2015-07-29 16:22:50 +02:00
|
|
|
## Comparable
|
|
|
|
* Descriptive build spec. Examples:
|
2015-07-29 16:07:51 +02:00
|
|
|
* https://embedux.github.io/documentation/usage/rootfs/configuration.yml/index.html
|
|
|
|
* http://nixos.org/nixos/about.html
|
|
|
|
* https://gitweb.gentoo.org/proj/releng.git/tree/releases/weekly/specs/amd64?id=HEAD
|
|
|
|
* https://github.com/zefhemel/nix-docker
|
|
|
|
* [nix build darm
|
|
|
|
paper](http://www.researchgate.net/publication/228629017_The_Nix_Build_Farm_A_declarative_approach_to_continuous_integration)
|
|
|
|
* https://github.com/jordansissel/fpm/wiki
|
|
|
|
|
|
|
|
# Usage
|
|
|
|
|
|
|
|
## Buildit configuration
|
|
|
|
**.builtit-config.yaml**
|
|
|
|
```
|
|
|
|
---
|
|
|
|
repository:
|
|
|
|
name: mysuperbinhost
|
|
|
|
upload-type: ssh
|
|
|
|
upload-path: containers@mysuperbinhost.org/containers
|
|
|
|
downnload-type: https
|
|
|
|
download-path: mysuperbinhost.org/containers
|
|
|
|
```
|
|
|
|
|
|
|
|
## Sysadmin needs patched nginx
|
|
|
|
|
|
|
|
|
|
|
|
### Sysadmin
|
2015-07-29 16:09:32 +02:00
|
|
|
In case a sysadmin needs a patched and specifically configured version of it's favorite webserver nginx.
|
2015-07-29 16:07:51 +02:00
|
|
|
|
|
|
|
1. Put directories and files in place
|
2015-07-29 16:09:32 +02:00
|
|
|
|
|
|
|
---
|
2015-07-29 16:07:51 +02:00
|
|
|
Directory layout
|
|
|
|
```
|
|
|
|
├── nginx-prod
|
|
|
|
│ ├── container.yaml
|
|
|
|
│ ├── files
|
|
|
|
│ │ └── nginx.conf
|
|
|
|
│ └── pkgs
|
|
|
|
│ └── nginx
|
|
|
|
│ ├── patches
|
|
|
|
│ │ └── https-only.patch
|
|
|
|
│ └── pkg.yaml
|
|
|
|
```
|
2015-07-29 16:09:32 +02:00
|
|
|
---
|
2015-07-29 16:07:51 +02:00
|
|
|
**pkg.yaml**
|
|
|
|
```
|
|
|
|
---
|
|
|
|
base: www-servers/nginx-1.7.6
|
|
|
|
author: Sysadmin42 <sys@admin42.org>
|
|
|
|
patches:
|
|
|
|
patches/https-only.patch: "This patch denies all plain http requests"
|
|
|
|
https://github.com/nginx/nginx/commit/52e4dc2f74fd032dace01acbe5eb29ddf7c1ad96.patch:
|
|
|
|
"Fix buffer overruns"
|
|
|
|
use:
|
|
|
|
with:
|
|
|
|
- ipv6
|
|
|
|
- selinux
|
|
|
|
|
|
|
|
```
|
2015-07-29 16:09:32 +02:00
|
|
|
---
|
2015-07-29 16:07:51 +02:00
|
|
|
**container.yaml**
|
|
|
|
```
|
|
|
|
---
|
|
|
|
- vars:
|
|
|
|
author: Sysadmin42
|
|
|
|
name: nginx-production
|
|
|
|
version: 1.7.6-p1
|
|
|
|
os: linux
|
|
|
|
arch: amd64
|
|
|
|
|
|
|
|
- package:
|
|
|
|
type: embedded
|
|
|
|
path: ./pkgs/nginx
|
|
|
|
|
|
|
|
- sync:
|
|
|
|
src: ./files/nginx.conf
|
|
|
|
dest: /etc/nginx/nginx.conf
|
|
|
|
recursive: True
|
|
|
|
chmod: 0644
|
|
|
|
|
|
|
|
- image:
|
|
|
|
type: aci
|
|
|
|
content: |
|
|
|
|
{
|
|
|
|
"acKind": "ImageManifest",
|
|
|
|
"acVersion": "0.6.1",
|
|
|
|
"name": "{{ name }}-{{ version }}",
|
|
|
|
"labels": [
|
|
|
|
{"name": "os", "value": "{{ os }}"},
|
|
|
|
{"name": "arch", "value": {{ arch }}}
|
|
|
|
],
|
|
|
|
"app": {
|
|
|
|
"exec": [
|
|
|
|
"/sbin/nginx"
|
|
|
|
],
|
|
|
|
"user": "0",
|
|
|
|
"group": "0"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
2. Build the container
|
|
|
|
```
|
2015-07-29 16:19:23 +02:00
|
|
|
$ buildit nginx-prod/ --discover=github.com/sysadmin42/containers,push=True
|
2015-07-29 16:07:51 +02:00
|
|
|
Building Sysadmin42/nginx-production-1.7.6-p1
|
2015-07-29 16:15:32 +02:00
|
|
|
Processing package from './pkgs/nginx' for linux/amd64.
|
|
|
|
HASH: 86c8ef43-f4a4-49ba-a0ee-92900211c7b6
|
2015-07-29 16:19:23 +02:00
|
|
|
Can't find HASH in any known location...
|
|
|
|
Defaulting to local build... [OK]
|
|
|
|
Uploading packages to 'mysuperbinhost' [OK]
|
|
|
|
Packaging Sysadmin42/nginx-production-1.7.6-p1 as ACI... [OK]
|
|
|
|
Uploading container spec and image(s) to 'mysuperbinhost' [OK]
|
2015-07-29 16:07:51 +02:00
|
|
|
```
|