New approach in package building and versioning
This commit is contained in:
parent
446b855d03
commit
afbd4a0f60
@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@ -39,5 +40,6 @@ def fix_world(layers):
|
|||||||
with open(os.path.join(layers[-1], 'etc/apk/world'), 'w') as f:
|
with open(os.path.join(layers[-1], 'etc/apk/world'), 'w') as f:
|
||||||
f.writelines(world)
|
f.writelines(world)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
fix_installed(sys.argv[1:])
|
fix_installed(sys.argv[1:])
|
||||||
fix_world(sys.argv[1:])
|
fix_world(sys.argv[1:])
|
||||||
|
@ -1,210 +1,11 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
import os
|
from lxcbuild.lxcimage import LXCImage
|
||||||
import shutil
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
|
|
||||||
LXC_ROOT = '/var/lib/lxc'
|
|
||||||
CONFIG_TEMPLATE = '''# Image name
|
|
||||||
lxc.uts.name = {name}
|
|
||||||
|
|
||||||
# Network
|
|
||||||
lxc.net.0.type = veth
|
|
||||||
lxc.net.0.link = lxcbr0
|
|
||||||
lxc.net.0.flags = up
|
|
||||||
|
|
||||||
# Volumes
|
|
||||||
lxc.rootfs.path = {rootfs}
|
|
||||||
|
|
||||||
# Mounts
|
|
||||||
lxc.mount.entry = shm dev/shm tmpfs rw,nodev,noexec,nosuid,relatime,mode=1777,create=dir 0 0
|
|
||||||
lxc.mount.entry = /etc/hosts etc/hosts none bind,create=file 0 0
|
|
||||||
lxc.mount.entry = /etc/resolv.conf etc/resolv.conf none bind,create=file 0 0
|
|
||||||
{mounts}
|
|
||||||
|
|
||||||
# Init
|
|
||||||
lxc.init.cmd = {cmd}
|
|
||||||
lxc.init.uid = {uid}
|
|
||||||
lxc.init.gid = {gid}
|
|
||||||
lxc.init.cwd = {cwd}
|
|
||||||
|
|
||||||
# Environment
|
|
||||||
lxc.environment = PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
|
||||||
{env}
|
|
||||||
|
|
||||||
# Halt
|
|
||||||
lxc.signal.halt = {halt}
|
|
||||||
|
|
||||||
# Log
|
|
||||||
lxc.console.size = 1MB
|
|
||||||
lxc.console.logfile = /var/log/lxc/{name}.log
|
|
||||||
|
|
||||||
# Other
|
|
||||||
lxc.arch = x86_64
|
|
||||||
lxc.cap.drop = sys_admin
|
|
||||||
lxc.hook.pre-start = /usr/bin/vmmgr prepare-container
|
|
||||||
lxc.hook.start-host = /usr/bin/vmmgr register-container
|
|
||||||
lxc.hook.post-stop = /usr/bin/vmmgr unregister-container
|
|
||||||
lxc.include = /usr/share/lxc/config/common.conf
|
|
||||||
'''
|
|
||||||
|
|
||||||
class LXCImage:
|
|
||||||
def __init__(self, build_path):
|
|
||||||
self.name = None
|
|
||||||
self.layers = []
|
|
||||||
self.mounts = []
|
|
||||||
self.env = []
|
|
||||||
self.uid = 0
|
|
||||||
self.gid = 0
|
|
||||||
self.cmd = '/bin/true'
|
|
||||||
self.cwd = '/'
|
|
||||||
self.halt = 'SIGINT'
|
|
||||||
|
|
||||||
if os.path.isfile(build_path):
|
|
||||||
self.lxcfile = os.path.realpath(build_path)
|
|
||||||
self.build_dir = os.path.dirname(self.lxcfile)
|
|
||||||
else:
|
|
||||||
self.build_dir = os.path.realpath(build_path)
|
|
||||||
self.lxcfile = os.path.join(self.build_dir, 'lxcfile')
|
|
||||||
|
|
||||||
def build(self):
|
|
||||||
with open(self.lxcfile, 'r') as f:
|
|
||||||
lxcfile = [l.strip() for l in f.readlines()]
|
|
||||||
|
|
||||||
script = []
|
|
||||||
script_eof = None
|
|
||||||
|
|
||||||
for line in lxcfile:
|
|
||||||
if script_eof:
|
|
||||||
if line == script_eof:
|
|
||||||
script_eof = None
|
|
||||||
self.run_script(script)
|
|
||||||
else:
|
|
||||||
script.append(line)
|
|
||||||
elif line.startswith('RUN'):
|
|
||||||
script = []
|
|
||||||
script_eof = line.split()[1]
|
|
||||||
elif line.startswith('IMAGE'):
|
|
||||||
self.set_name(line.split()[1])
|
|
||||||
elif line.startswith('LAYER'):
|
|
||||||
self.add_layer(line.split()[1])
|
|
||||||
elif line.startswith('FIXLAYER'):
|
|
||||||
self.fix_layer(line.split()[1])
|
|
||||||
elif line.startswith('COPY'):
|
|
||||||
srcdst = line.split()
|
|
||||||
self.copy_files(srcdst[1], srcdst[2] if len(srcdst) == 3 else '')
|
|
||||||
elif line.startswith('MOUNT'):
|
|
||||||
mount = line.split()
|
|
||||||
self.add_mount(mount[1], mount[2], mount[3])
|
|
||||||
elif line.startswith('ENV'):
|
|
||||||
env = line.split()
|
|
||||||
self.add_env(env[1], env[2])
|
|
||||||
elif line.startswith('USER'):
|
|
||||||
uidgid = line.split()
|
|
||||||
self.set_user(uidgid[1], uidgid[2])
|
|
||||||
elif line.startswith('CMD'):
|
|
||||||
self.set_cmd(' '.join(line.split()[1:]))
|
|
||||||
elif line.startswith('WORKDIR'):
|
|
||||||
self.set_cwd(line.split()[1])
|
|
||||||
elif line.startswith('HALT'):
|
|
||||||
self.set_halt(line.split()[1])
|
|
||||||
# Add the final layer which will be treated as ephemeral
|
|
||||||
self.add_layer('{}/delta0'.format(self.name))
|
|
||||||
|
|
||||||
def rebuild_config(self):
|
|
||||||
if not self.name:
|
|
||||||
return
|
|
||||||
if len(self.layers) == 1:
|
|
||||||
rootfs = self.layers[0]
|
|
||||||
else:
|
|
||||||
# Multiple lower overlayfs layers are ordered from right to left (lower2:lower1:rootfs:upper)
|
|
||||||
rootfs = 'overlay:{}:{}'.format(':'.join(self.layers[:-1][::-1]), self.layers[-1])
|
|
||||||
mounts = '\n'.join(self.mounts)
|
|
||||||
env = '\n'.join(self.env)
|
|
||||||
with open(os.path.join(LXC_ROOT, self.name, 'config'), 'w') as f:
|
|
||||||
f.write(CONFIG_TEMPLATE.format(name=self.name,
|
|
||||||
rootfs=rootfs, mounts=mounts, env=env,
|
|
||||||
uid=self.uid, gid=self.gid,
|
|
||||||
cmd=self.cmd, cwd=self.cwd, halt=self.halt))
|
|
||||||
|
|
||||||
def run_script(self, script):
|
|
||||||
sh = os.path.join(self.layers[-1], 'run.sh')
|
|
||||||
with open(sh, 'w') as f:
|
|
||||||
f.write('#!/bin/sh\nset -ev\n\n{}\n'.format('\n'.join(script)))
|
|
||||||
os.chmod(sh, 0o700)
|
|
||||||
subprocess.run(['lxc-execute', '-n', self.name, '--', '/bin/sh', '-lc', '/run.sh'], check=True)
|
|
||||||
os.unlink(sh)
|
|
||||||
|
|
||||||
def set_name(self, name):
|
|
||||||
self.name = name
|
|
||||||
os.makedirs(os.path.join(LXC_ROOT, self.name), 0o755, True)
|
|
||||||
|
|
||||||
def add_layer(self, layer):
|
|
||||||
layer = os.path.join(LXC_ROOT, layer)
|
|
||||||
self.layers.append(layer)
|
|
||||||
os.makedirs(layer, 0o755, True)
|
|
||||||
self.rebuild_config()
|
|
||||||
|
|
||||||
def fix_layer(self, cmd):
|
|
||||||
subprocess.run([cmd]+self.layers, check=True)
|
|
||||||
|
|
||||||
def copy_files(self, src, dst):
|
|
||||||
dst = os.path.join(self.layers[-1], dst)
|
|
||||||
if src.startswith('http://') or src.startswith('https://'):
|
|
||||||
self.unpack_http_archive(src, dst)
|
|
||||||
else:
|
|
||||||
src = os.path.join(self.build_dir, src)
|
|
||||||
copy_tree(src, dst)
|
|
||||||
|
|
||||||
def unpack_http_archive(self, src, dst):
|
|
||||||
xf = 'xzf'
|
|
||||||
if src.endswith('.bz2'):
|
|
||||||
xf = 'xjf'
|
|
||||||
elif src.endswith('.xz'):
|
|
||||||
xf = 'xJf'
|
|
||||||
with subprocess.Popen(['wget', src, '-O', '-'], stdout=subprocess.PIPE) as wget:
|
|
||||||
with subprocess.Popen(['tar', xf, '-', '-C', dst], stdin=wget.stdout) as tar:
|
|
||||||
wget.stdout.close()
|
|
||||||
tar.wait()
|
|
||||||
|
|
||||||
def add_mount(self, type, src, dst):
|
|
||||||
self.mounts.append('lxc.mount.entry = {} {} none bind,create={} 0 0'.format(src, dst, type.lower()))
|
|
||||||
self.rebuild_config()
|
|
||||||
|
|
||||||
def add_env(self, key, value):
|
|
||||||
self.env.append('lxc.environment = {}={}'.format(key, value))
|
|
||||||
self.rebuild_config()
|
|
||||||
|
|
||||||
def set_user(self, uid, gid):
|
|
||||||
self.uid = uid
|
|
||||||
self.gid = gid
|
|
||||||
self.rebuild_config()
|
|
||||||
|
|
||||||
def set_cmd(self, cmd):
|
|
||||||
self.cmd = cmd
|
|
||||||
self.rebuild_config()
|
|
||||||
|
|
||||||
def set_cwd(self, cwd):
|
|
||||||
self.cwd = cwd
|
|
||||||
self.rebuild_config()
|
|
||||||
|
|
||||||
def set_halt(self, halt):
|
|
||||||
self.halt = halt
|
|
||||||
self.rebuild_config()
|
|
||||||
|
|
||||||
def copy_tree(src, dst):
|
|
||||||
if not os.path.isdir(src):
|
|
||||||
shutil.copy2(src, dst)
|
|
||||||
else:
|
|
||||||
os.makedirs(dst, exist_ok=True)
|
|
||||||
for name in os.listdir(src):
|
|
||||||
copy_tree(os.path.join(src, name), os.path.join(dst, name))
|
|
||||||
shutil.copystat(src, dst)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
if len(sys.argv) != 2 or sys.argv[1] in ('-h', '--help'):
|
if len(sys.argv) != 2 or sys.argv[1] in ('-h', '--help'):
|
||||||
print('Usage: lxc-build <buildpath>\n where the buildpath can be either specific lxcfile or a directory containing one')
|
print('Usage: lxc-build <buildpath>\n where the buildpath can be either specific lxcfile or a directory containing one')
|
||||||
else:
|
else:
|
||||||
i = LXCImage(sys.argv[1])
|
image = LXCImage(sys.argv[1])
|
||||||
i.build()
|
image.build_and_pack()
|
||||||
|
@ -1,92 +0,0 @@
|
|||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
import hashlib
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from cryptography.hazmat.backends import default_backend
|
|
||||||
from cryptography.hazmat.primitives import hashes
|
|
||||||
from cryptography.hazmat.primitives.asymmetric import ec
|
|
||||||
from cryptography.hazmat.primitives.serialization import load_pem_private_key
|
|
||||||
|
|
||||||
PKG_ROOT = '/srv/build/lxc'
|
|
||||||
PRIVATE_KEY = '/srv/build/packages.key'
|
|
||||||
LXC_ROOT = '/var/lib/lxc'
|
|
||||||
|
|
||||||
def pack(path):
|
|
||||||
# Determine correct metadata file and package name
|
|
||||||
path = os.path.realpath(path)
|
|
||||||
if os.path.isdir(path):
|
|
||||||
meta_dir = path
|
|
||||||
meta_file = os.path.join(meta_dir, 'meta')
|
|
||||||
else:
|
|
||||||
meta_dir = os.path.dirname(path)
|
|
||||||
meta_file = path
|
|
||||||
pkg_name = os.path.basename(meta_dir)
|
|
||||||
|
|
||||||
# Load metadata
|
|
||||||
with open(meta_file) as f:
|
|
||||||
meta = json.load(f)
|
|
||||||
|
|
||||||
# Prepare package file names
|
|
||||||
os.makedirs(PKG_ROOT, 0o755, True)
|
|
||||||
tar_path = os.path.join(PKG_ROOT, '{}_{}-{}.tar'.format(pkg_name, meta['version'], meta['release']))
|
|
||||||
xz_path = '{}.xz'.format(tar_path)
|
|
||||||
|
|
||||||
# Remove old package
|
|
||||||
if os.path.exists(tar_path):
|
|
||||||
os.unlink(tar_path)
|
|
||||||
if os.path.exists(xz_path):
|
|
||||||
os.unlink(xz_path)
|
|
||||||
|
|
||||||
# Create archive
|
|
||||||
print('Archiving', meta['lxcpath'])
|
|
||||||
subprocess.run(['tar', '--xattrs', '-cpf', tar_path, os.path.join(LXC_ROOT, meta['lxcpath'])], cwd='/')
|
|
||||||
# Add install/upgrade/uninstall scripts
|
|
||||||
scripts = ('install', 'install.sh', 'upgrade', 'upgrade.sh', 'uninstall', 'uninstall.sh')
|
|
||||||
scripts = [s for s in scripts if os.path.exists(os.path.join(meta_dir, s))]
|
|
||||||
subprocess.run(['tar', '--transform', 's|^|srv/{}/|'.format(pkg_name), '-rpf', tar_path] + scripts, cwd=meta_dir)
|
|
||||||
# Compress the tarball with xz (LZMA2)
|
|
||||||
print('Compressing', tar_path, '({:.2f} MB)'.format(os.path.getsize(tar_path)/1048576))
|
|
||||||
subprocess.run(['xz', '-9', tar_path])
|
|
||||||
print('Compressed ', xz_path, '({:.2f} MB)'.format(os.path.getsize(xz_path)/1048576))
|
|
||||||
|
|
||||||
# Register package
|
|
||||||
print('Registering package')
|
|
||||||
packages = {}
|
|
||||||
packages_file = os.path.join(PKG_ROOT, 'packages')
|
|
||||||
if os.path.exists(packages_file):
|
|
||||||
with open(packages_file, 'r') as f:
|
|
||||||
packages = json.load(f)
|
|
||||||
packages[pkg_name] = meta
|
|
||||||
packages[pkg_name]['size'] = os.path.getsize(xz_path)
|
|
||||||
packages[pkg_name]['sha512'] = hash_file(xz_path)
|
|
||||||
with open(packages_file, 'w') as f:
|
|
||||||
json.dump(packages, f, sort_keys=True, indent=4)
|
|
||||||
|
|
||||||
# Sign packages file
|
|
||||||
print('Signing packages')
|
|
||||||
with open(PRIVATE_KEY, 'rb') as f:
|
|
||||||
priv_key = load_pem_private_key(f.read(), None, default_backend())
|
|
||||||
with open(os.path.join(PKG_ROOT, 'packages'), 'rb') as f:
|
|
||||||
data = f.read()
|
|
||||||
with open(os.path.join(PKG_ROOT, 'packages.sig'), 'wb') as f:
|
|
||||||
f.write(priv_key.sign(data, ec.ECDSA(hashes.SHA512())))
|
|
||||||
|
|
||||||
def hash_file(file_path):
|
|
||||||
sha512 = hashlib.sha512()
|
|
||||||
with open(file_path, 'rb') as f:
|
|
||||||
while True:
|
|
||||||
data = f.read(65536)
|
|
||||||
if not data:
|
|
||||||
break
|
|
||||||
sha512.update(data)
|
|
||||||
return sha512.hexdigest()
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
if len(sys.argv) != 2 or sys.argv[1] in ('-h', '--help'):
|
|
||||||
print('Usage: lxc-pack <buildpath>\n where the buildpath can be either specific meta file or a directory containing one')
|
|
||||||
else:
|
|
||||||
pack(sys.argv[1])
|
|
1
build/usr/lib/python3.6/lxcbuild/__init__.py
Normal file
1
build/usr/lib/python3.6/lxcbuild/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
213
build/usr/lib/python3.6/lxcbuild/lxcbuilder.py
Normal file
213
build/usr/lib/python3.6/lxcbuild/lxcbuilder.py
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
LXC_ROOT = '/var/lib/lxc'
|
||||||
|
CONFIG_TEMPLATE = '''# Image name
|
||||||
|
lxc.uts.name = {name}
|
||||||
|
|
||||||
|
# Network
|
||||||
|
lxc.net.0.type = veth
|
||||||
|
lxc.net.0.link = lxcbr0
|
||||||
|
lxc.net.0.flags = up
|
||||||
|
|
||||||
|
# Volumes
|
||||||
|
lxc.rootfs.path = {rootfs}
|
||||||
|
|
||||||
|
# Mounts
|
||||||
|
lxc.mount.entry = shm dev/shm tmpfs rw,nodev,noexec,nosuid,relatime,mode=1777,create=dir 0 0
|
||||||
|
lxc.mount.entry = /etc/hosts etc/hosts none bind,create=file 0 0
|
||||||
|
lxc.mount.entry = /etc/resolv.conf etc/resolv.conf none bind,create=file 0 0
|
||||||
|
{mounts}
|
||||||
|
|
||||||
|
# Init
|
||||||
|
lxc.init.uid = {uid}
|
||||||
|
lxc.init.gid = {gid}
|
||||||
|
lxc.init.cwd = {cwd}
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
lxc.environment = PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||||
|
{env}
|
||||||
|
|
||||||
|
# Halt
|
||||||
|
lxc.signal.halt = {halt}
|
||||||
|
|
||||||
|
# Log
|
||||||
|
lxc.console.size = 1MB
|
||||||
|
lxc.console.logfile = /var/log/lxc/{name}.log
|
||||||
|
|
||||||
|
# Other
|
||||||
|
lxc.arch = x86_64
|
||||||
|
lxc.cap.drop = sys_admin
|
||||||
|
lxc.hook.pre-start = /usr/bin/vmmgr prepare-container
|
||||||
|
lxc.hook.start-host = /usr/bin/vmmgr register-container
|
||||||
|
lxc.hook.post-stop = /usr/bin/vmmgr unregister-container
|
||||||
|
lxc.include = /usr/share/lxc/config/common.conf
|
||||||
|
'''
|
||||||
|
|
||||||
|
class LXCBuilder:
|
||||||
|
def __init__(self, image):
|
||||||
|
self.image = image
|
||||||
|
self.script = []
|
||||||
|
self.script_eof = None
|
||||||
|
self.already_built = False
|
||||||
|
|
||||||
|
def build(self):
|
||||||
|
with open(self.image.lxcfile, 'r') as f:
|
||||||
|
for line in f:
|
||||||
|
line = line.strip()
|
||||||
|
if self.script_eof:
|
||||||
|
if line == self.script_eof:
|
||||||
|
self.script_eof = None
|
||||||
|
self.run_script(self.script)
|
||||||
|
else:
|
||||||
|
self.script.append(line)
|
||||||
|
elif line:
|
||||||
|
self.process_line(*line.split(None, 1))
|
||||||
|
|
||||||
|
def process_line(self, directive, args):
|
||||||
|
if 'RUN' == directive:
|
||||||
|
self.script = []
|
||||||
|
self.script_eof = args
|
||||||
|
elif 'IMAGE' == directive:
|
||||||
|
self.set_name(*args.split())
|
||||||
|
elif 'META' == directive:
|
||||||
|
self.add_meta(*args.split(None, 1))
|
||||||
|
elif 'LAYER' == directive:
|
||||||
|
self.add_layer(*args.split())
|
||||||
|
elif 'FIXLAYER' == directive:
|
||||||
|
self.fix_layer(args.split())
|
||||||
|
elif 'COPY' == directive:
|
||||||
|
srcdst = args.split()
|
||||||
|
self.copy_files(srcdst[0], srcdst[1] if len(srcdst) == 2 else '')
|
||||||
|
elif 'MOUNT' == directive:
|
||||||
|
self.add_mount(args.split())
|
||||||
|
elif 'ENV' == directive:
|
||||||
|
self.add_env(*args.split(None, 1))
|
||||||
|
elif 'USER' == directive:
|
||||||
|
self.set_user(*args.split())
|
||||||
|
elif 'CMD' == directive:
|
||||||
|
self.set_cmd(args)
|
||||||
|
elif 'WORKDIR' == directive:
|
||||||
|
self.set_cwd(args)
|
||||||
|
elif 'HALT' == directive:
|
||||||
|
self.set_halt(args)
|
||||||
|
|
||||||
|
def get_layer_path(self, layer):
|
||||||
|
return os.path.join(LXC_ROOT, 'storage', layer)
|
||||||
|
|
||||||
|
def rebuild_config(self):
|
||||||
|
if not self.image.upper_layer:
|
||||||
|
return
|
||||||
|
upper_layer = self.get_layer_path(self.image.upper_layer)
|
||||||
|
if not self.image.layers:
|
||||||
|
rootfs = upper_layer
|
||||||
|
else:
|
||||||
|
# Multiple lower overlayfs layers are ordered from right to left (lower2:lower1:rootfs:upper)
|
||||||
|
layers = [self.get_layer_path(layer) for layer in self.image.layers]
|
||||||
|
rootfs = 'overlay:{}:{}'.format(':'.join(layers[::-1]), upper_layer)
|
||||||
|
mounts = '\n'.join(['lxc.mount.entry = {} {} none bind,create={} 0 0'.format(m[1], m[2], m[0].lower()) for m in self.image.mounts])
|
||||||
|
env = '\n'.join(['lxc.environment = {}={}'.format(e[0], e[1]) for e in self.image.env])
|
||||||
|
cwd = self.image.cwd if self.image.cwd else '/'
|
||||||
|
halt = self.image.halt if self.image.halt else 'SIGINT'
|
||||||
|
with open(os.path.join(LXC_ROOT, self.image.upper_layer, 'config'), 'w') as f:
|
||||||
|
f.write(CONFIG_TEMPLATE.format(name=self.image.upper_layer, rootfs=rootfs, mounts=mounts, env=env, uid=self.image.uid, gid=self.image.gid, cwd=cwd, halt=halt))
|
||||||
|
|
||||||
|
def run_script(self, script):
|
||||||
|
if self.already_built:
|
||||||
|
return
|
||||||
|
sh = os.path.join(self.get_layer_path(self.image.upper_layer), 'run.sh')
|
||||||
|
with open(sh, 'w') as f:
|
||||||
|
f.write('#!/bin/sh\nset -ev\n\n{}\n'.format('\n'.join(script)))
|
||||||
|
os.chmod(sh, 0o700)
|
||||||
|
subprocess.run(['lxc-execute', '-n', self.image.upper_layer, '--', '/bin/sh', '-lc', '/run.sh'], check=True)
|
||||||
|
os.unlink(sh)
|
||||||
|
|
||||||
|
def set_name(self, name, version):
|
||||||
|
self.image.name = name
|
||||||
|
self.image.version = version
|
||||||
|
self.image.upper_layer = '{}_{}'.format(self.image.name, self.image.version)
|
||||||
|
layer_path = self.get_layer_path(self.image.upper_layer)
|
||||||
|
if os.path.exists(layer_path):
|
||||||
|
self.already_built = True
|
||||||
|
print('Layer {} already exists, skipping build tasks'.format(self.image.upper_layer))
|
||||||
|
else:
|
||||||
|
os.makedirs(layer_path, 0o755, True)
|
||||||
|
os.makedirs(os.path.join(LXC_ROOT, self.image.upper_layer), 0o755, True)
|
||||||
|
self.rebuild_config()
|
||||||
|
|
||||||
|
def add_meta(self, key, value):
|
||||||
|
self.image.meta[key] = value
|
||||||
|
|
||||||
|
def add_layer(self, name, version):
|
||||||
|
self.image.layers.append('{}_{}'.format(name, version))
|
||||||
|
self.rebuild_config()
|
||||||
|
|
||||||
|
def fix_layer(self, cmd):
|
||||||
|
if self.already_built:
|
||||||
|
return
|
||||||
|
layers = [self.get_layer_path(layer) for layer in self.image.layers]
|
||||||
|
layers.append(self.get_layer_path(self.image.upper_layer))
|
||||||
|
subprocess.run([cmd]+layers, check=True)
|
||||||
|
|
||||||
|
def copy_files(self, src, dst):
|
||||||
|
if self.already_built:
|
||||||
|
return
|
||||||
|
dst = os.path.join(self.get_layer_path(self.image.upper_layer), dst)
|
||||||
|
if src.startswith('http://') or src.startswith('https://'):
|
||||||
|
unpack_http_archive(src, dst)
|
||||||
|
else:
|
||||||
|
src = os.path.join(self.image.build_dir, src)
|
||||||
|
copy_tree(src, dst)
|
||||||
|
|
||||||
|
def add_mount(self, args):
|
||||||
|
self.image.mounts.append(args)
|
||||||
|
if not self.already_built:
|
||||||
|
self.rebuild_config()
|
||||||
|
|
||||||
|
def add_env(self, args):
|
||||||
|
self.image.env.append(args)
|
||||||
|
if not self.already_built:
|
||||||
|
self.rebuild_config()
|
||||||
|
|
||||||
|
def set_user(self, uid, gid):
|
||||||
|
self.image.uid = uid
|
||||||
|
self.image.gid = gid
|
||||||
|
if not self.already_built:
|
||||||
|
self.rebuild_config()
|
||||||
|
|
||||||
|
def set_cmd(self, cmd):
|
||||||
|
self.image.cmd = cmd
|
||||||
|
|
||||||
|
def set_cwd(self, cwd):
|
||||||
|
self.image.cwd = cwd
|
||||||
|
if not self.already_built:
|
||||||
|
self.rebuild_config()
|
||||||
|
|
||||||
|
def set_halt(self, halt):
|
||||||
|
self.image.halt = halt
|
||||||
|
if not self.already_built:
|
||||||
|
self.rebuild_config()
|
||||||
|
|
||||||
|
def unpack_http_archive(src, dst):
|
||||||
|
xf = 'xzf'
|
||||||
|
if src.endswith('.bz2'):
|
||||||
|
xf = 'xjf'
|
||||||
|
elif src.endswith('.xz'):
|
||||||
|
xf = 'xJf'
|
||||||
|
with subprocess.Popen(['wget', src, '-O', '-'], stdout=subprocess.PIPE) as wget:
|
||||||
|
with subprocess.Popen(['tar', xf, '-', '-C', dst], stdin=wget.stdout) as tar:
|
||||||
|
wget.stdout.close()
|
||||||
|
tar.wait()
|
||||||
|
|
||||||
|
def copy_tree(src, dst):
|
||||||
|
if not os.path.isdir(src):
|
||||||
|
shutil.copy2(src, dst)
|
||||||
|
else:
|
||||||
|
os.makedirs(dst, exist_ok=True)
|
||||||
|
for name in os.listdir(src):
|
||||||
|
copy_tree(os.path.join(src, name), os.path.join(dst, name))
|
||||||
|
shutil.copystat(src, dst)
|
34
build/usr/lib/python3.6/lxcbuild/lxcimage.py
Normal file
34
build/usr/lib/python3.6/lxcbuild/lxcimage.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from .lxcbuilder import LXCBuilder
|
||||||
|
from .lxcpacker import LXCPacker
|
||||||
|
|
||||||
|
class LXCImage:
|
||||||
|
def __init__(self, build_path):
|
||||||
|
self.name = None
|
||||||
|
self.version = None
|
||||||
|
self.meta = {}
|
||||||
|
self.layers = []
|
||||||
|
self.upper_layer = None
|
||||||
|
self.mounts = []
|
||||||
|
self.env = []
|
||||||
|
self.uid = 0
|
||||||
|
self.gid = 0
|
||||||
|
self.cmd = None
|
||||||
|
self.cwd = None
|
||||||
|
self.halt = None
|
||||||
|
|
||||||
|
if os.path.isfile(build_path):
|
||||||
|
self.lxcfile = os.path.realpath(build_path)
|
||||||
|
self.build_dir = os.path.dirname(self.lxcfile)
|
||||||
|
else:
|
||||||
|
self.build_dir = os.path.realpath(build_path)
|
||||||
|
self.lxcfile = os.path.join(self.build_dir, 'lxcfile')
|
||||||
|
|
||||||
|
def build_and_pack(self):
|
||||||
|
builder = LXCBuilder(self)
|
||||||
|
builder.build()
|
||||||
|
packer = LXCPacker(self)
|
||||||
|
packer.pack()
|
89
build/usr/lib/python3.6/lxcbuild/lxcpacker.py
Normal file
89
build/usr/lib/python3.6/lxcbuild/lxcpacker.py
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from cryptography.hazmat.backends import default_backend
|
||||||
|
from cryptography.hazmat.primitives import hashes
|
||||||
|
from cryptography.hazmat.primitives.asymmetric import ec
|
||||||
|
from cryptography.hazmat.primitives.serialization import load_pem_private_key
|
||||||
|
|
||||||
|
PKG_ROOT = '/srv/build/lxc'
|
||||||
|
PRIVATE_KEY = '/srv/build/packages.key'
|
||||||
|
LXC_STORAGE = '/var/lib/lxc/storage'
|
||||||
|
|
||||||
|
class LXCPacker:
|
||||||
|
def __init__(self, image):
|
||||||
|
self.image = image
|
||||||
|
self.tar_path = None
|
||||||
|
self.xz_path = None
|
||||||
|
|
||||||
|
def pack(self):
|
||||||
|
# Prepare package file names
|
||||||
|
self.tar_path = os.path.join(PKG_ROOT, '{}.tar'.format(self.image.upper_layer))
|
||||||
|
self.xz_path = '{}.xz'.format(self.tar_path)
|
||||||
|
if os.path.exists(self.xz_path):
|
||||||
|
print('Package {} already exists, skipping packaging tasks'.format(self.xz_path))
|
||||||
|
return
|
||||||
|
os.makedirs(PKG_ROOT, 0o755, True)
|
||||||
|
self.create_archive()
|
||||||
|
self.register_package()
|
||||||
|
self.sign_packages()
|
||||||
|
|
||||||
|
def create_archive(self):
|
||||||
|
# Create archive
|
||||||
|
print('Archiving', self.image.upper_layer)
|
||||||
|
subprocess.run(['tar', '--xattrs', '-cpf', self.tar_path, os.path.join(LXC_STORAGE, self.image.upper_layer)], cwd='/')
|
||||||
|
# Add install/upgrade/uninstall scripts
|
||||||
|
scripts = ('install', 'install.sh', 'upgrade', 'upgrade.sh', 'uninstall', 'uninstall.sh')
|
||||||
|
scripts = [s for s in scripts if os.path.exists(os.path.join(self.image.build_dir, s))]
|
||||||
|
subprocess.run(['tar', '--transform', 's|^|srv/{}/|'.format(self.image.upper_layer), '-rpf', self.tar_path] + scripts, cwd=self.image.build_dir)
|
||||||
|
# Compress the tarball with xz (LZMA2)
|
||||||
|
print('Compressing', self.tar_path, '({:.2f} MB)'.format(os.path.getsize(self.tar_path)/1048576))
|
||||||
|
subprocess.run(['xz', '-9', self.tar_path])
|
||||||
|
print('Compressed ', self.xz_path, '({:.2f} MB)'.format(os.path.getsize(self.xz_path)/1048576))
|
||||||
|
|
||||||
|
def register_package(self):
|
||||||
|
# Prepare metadata
|
||||||
|
meta = self.image.meta.copy()
|
||||||
|
meta['lxc'] = {}
|
||||||
|
for key in ('layers', 'mounts', 'env', 'cmd', 'cwd', 'uid', 'gid', 'halt'):
|
||||||
|
value = getattr(self.image, key)
|
||||||
|
if value:
|
||||||
|
meta['lxc'][key] = value
|
||||||
|
|
||||||
|
# Register package
|
||||||
|
print('Registering package')
|
||||||
|
packages = {}
|
||||||
|
packages_file = os.path.join(PKG_ROOT, 'packages')
|
||||||
|
if os.path.exists(packages_file):
|
||||||
|
with open(packages_file, 'r') as f:
|
||||||
|
packages = json.load(f)
|
||||||
|
packages[self.image.name] = meta
|
||||||
|
packages[self.image.name]['size'] = os.path.getsize(self.xz_path)
|
||||||
|
packages[self.image.name]['sha512'] = hash_file(self.xz_path)
|
||||||
|
with open(packages_file, 'w') as f:
|
||||||
|
json.dump(packages, f, sort_keys=True, indent=4)
|
||||||
|
|
||||||
|
def sign_packages(self):
|
||||||
|
# Sign packages file
|
||||||
|
print('Signing packages')
|
||||||
|
with open(PRIVATE_KEY, 'rb') as f:
|
||||||
|
priv_key = load_pem_private_key(f.read(), None, default_backend())
|
||||||
|
with open(os.path.join(PKG_ROOT, 'packages'), 'rb') as f:
|
||||||
|
data = f.read()
|
||||||
|
with open(os.path.join(PKG_ROOT, 'packages.sig'), 'wb') as f:
|
||||||
|
f.write(priv_key.sign(data, ec.ECDSA(hashes.SHA512())))
|
||||||
|
|
||||||
|
def hash_file(file_path):
|
||||||
|
sha512 = hashlib.sha512()
|
||||||
|
with open(file_path, 'rb') as f:
|
||||||
|
while True:
|
||||||
|
data = f.read(65536)
|
||||||
|
if not data:
|
||||||
|
break
|
||||||
|
sha512.update(data)
|
||||||
|
return sha512.hexdigest()
|
@ -1,7 +1,12 @@
|
|||||||
IMAGE ckan-datapusher
|
IMAGE ckan-datapusher 0.0.13-190620
|
||||||
LAYER shared/alpine3.9
|
META title CKAN DataPusher
|
||||||
LAYER shared/alpine3.9-python2.7
|
META desc-cs Služba datového skladu pro extrakci dat
|
||||||
LAYER ckan-datapusher/ckan-datapusher
|
META desc-en Data store data extraction service
|
||||||
|
META type app
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-python2.7 2.7.16-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install runtime dependencies
|
# Install runtime dependencies
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Služba datového skladu pro extrakci dat",
|
|
||||||
"desc-en": "Data store data extraction service",
|
|
||||||
"lxcpath": "ckan-datapusher",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-python2.7"]
|
|
||||||
}
|
|
@ -1,7 +1,13 @@
|
|||||||
IMAGE ckan
|
IMAGE ckan 2.8.2-190620
|
||||||
LAYER shared/alpine3.9
|
META title CKAN
|
||||||
LAYER shared/alpine3.9-python2.7
|
META desc-cs Datový sklad
|
||||||
LAYER ckan/ckan
|
META desc-en Data store
|
||||||
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends ckan-datapusher postgres redis solr
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-python2.7 2.7.16-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install runtime dependencies
|
# Install runtime dependencies
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "CKAN",
|
|
||||||
"desc-cs": "Datový sklad",
|
|
||||||
"desc-en": "Data store",
|
|
||||||
"lxcpath": "ckan",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-python2.7", "ckan-datapusher", "postgres", "redis", "solr"]
|
|
||||||
}
|
|
@ -1,8 +1,14 @@
|
|||||||
IMAGE crisiscleanup
|
IMAGE crisiscleanup 2.2.0-190620
|
||||||
LAYER shared/alpine3.8
|
META title Crisis Cleanup
|
||||||
LAYER shared/alpine3.8-ruby2.4
|
META desc-cs Mapování následků katastrof
|
||||||
LAYER shared/alpine3.8-nodejs8
|
META desc-en Disaster relief mapping
|
||||||
LAYER crisiscleanup/crisiscleanup
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.8 3.8.4-190620
|
||||||
|
LAYER alpine3.8-ruby2.4 2.4.5-190620
|
||||||
|
LAYER alpine3.8-nodejs8 8.14.0-190620
|
||||||
|
|
||||||
FIXLAYER /usr/bin/fix-apk
|
FIXLAYER /usr/bin/fix-apk
|
||||||
|
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "Crisis Cleanup",
|
|
||||||
"desc-cs": "Mapování následků katastrof",
|
|
||||||
"desc-en": "Disaster relief mapping",
|
|
||||||
"lxcpath": "crisiscleanup",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.8-ruby2.4", "alpine3.8-nodejs8", "postgres"]
|
|
||||||
}
|
|
@ -1,7 +1,13 @@
|
|||||||
IMAGE cts
|
IMAGE cts 0.8.0-190620
|
||||||
LAYER shared/alpine3.9
|
META title CTS
|
||||||
LAYER shared/alpine3.9-python2.7
|
META desc-cs Sledovací systém komodit
|
||||||
LAYER cts/cts
|
META desc-en Commodity tracking system
|
||||||
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-python2.7 2.7.16-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install runtime dependencies
|
# Install runtime dependencies
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "CTS",
|
|
||||||
"desc-cs": "Sledovací systém komodit",
|
|
||||||
"desc-en": "Commodity tracking system",
|
|
||||||
"lxcpath": "cts",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-python2.7", "postgres"]
|
|
||||||
}
|
|
@ -1,7 +1,13 @@
|
|||||||
IMAGE ecogis
|
IMAGE ecogis 0.0.1-190620
|
||||||
LAYER shared/alpine3.8
|
META title EcoGIS
|
||||||
LAYER shared/alpine3.8-php5.6
|
META desc-cs EcoGIS
|
||||||
LAYER ecogis/ecogis
|
META desc-en EcoGIS
|
||||||
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.8 3.8.4-190620
|
||||||
|
LAYER alpine3.8-php5.6 5.6.40-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install runtime dependencies
|
# Install runtime dependencies
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "EcoGIS",
|
|
||||||
"desc-cs": "EcoGIS",
|
|
||||||
"desc-en": "EcoGIS",
|
|
||||||
"lxcpath": "ecogis",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.8-php5.6", "postgres"]
|
|
||||||
}
|
|
@ -1,7 +1,12 @@
|
|||||||
IMAGE frontlinesms
|
IMAGE frontlinesms 2.6.5-190620
|
||||||
LAYER shared/alpine3.9
|
META title FrontlineSMS
|
||||||
LAYER shared/alpine3.9-java8
|
META desc-cs Hromadné odesílání zpráv
|
||||||
LAYER frontlinesms/frontlinesms
|
META desc-en Bulk SMS messaging
|
||||||
|
META type app
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-java8 8.212.04-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install runtime dependencies
|
# Install runtime dependencies
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "FrontlineSMS",
|
|
||||||
"desc-cs": "Hromadné odesílání zpráv",
|
|
||||||
"desc-en": "Bulk SMS messaging",
|
|
||||||
"lxcpath": "frontlinesms",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-java8"]
|
|
||||||
}
|
|
@ -1,8 +1,14 @@
|
|||||||
IMAGE gnuhealth
|
IMAGE gnuhealth 3.4.1-190620
|
||||||
LAYER shared/alpine3.9
|
META title GNU Health
|
||||||
LAYER shared/alpine3.9-python3.6
|
META desc-cs Administrace lékařských záznamů
|
||||||
LAYER shared/alpine3.9-nodejs10
|
META desc-en Medical records administration
|
||||||
LAYER gnuhealth/gnuhealth
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-python3.6 3.6.8-190620
|
||||||
|
LAYER alpine3.9-nodejs10 10.14.2-190620
|
||||||
|
|
||||||
FIXLAYER /usr/bin/fix-apk
|
FIXLAYER /usr/bin/fix-apk
|
||||||
|
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "GNU Health",
|
|
||||||
"desc-cs": "Lékařské záznamy pacientů",
|
|
||||||
"desc-en": "Lékařské záznamy pacientů",
|
|
||||||
"lxcpath": "gnuhealth",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-python3.6", "alpine3.9-nodejs10", "postgres"]
|
|
||||||
}
|
|
@ -1,7 +1,13 @@
|
|||||||
IMAGE kanboard
|
IMAGE kanboard 1.2.9-190620
|
||||||
LAYER shared/alpine3.9
|
META title KanBoard
|
||||||
LAYER shared/alpine3.9-php7.2
|
META desc-cs Kanban řízení projektů
|
||||||
LAYER kanboard/kanboard
|
META desc-en Kanban project management
|
||||||
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-php7.2 7.2.19-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install runtime dependencies
|
# Install runtime dependencies
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "KanBoard",
|
|
||||||
"desc-cs": "Kanban řízení projektů",
|
|
||||||
"desc-en": "Kanban řízení projektů",
|
|
||||||
"lxcpath": "kanboard",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-php7.2", "postgres"]
|
|
||||||
}
|
|
@ -1,8 +1,14 @@
|
|||||||
IMAGE mifosx
|
IMAGE mifosx 18.03.01-190620
|
||||||
LAYER shared/alpine3.9
|
META title Mifos X
|
||||||
LAYER shared/alpine3.9-java8
|
META desc-cs Mikrofinancování rozvojových projektů
|
||||||
LAYER shared/alpine3.9-tomcat8.5
|
META desc-en Development projects microfinancing
|
||||||
LAYER mifosx/mifosx
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends mariadb
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-java8 8.212.04-190620
|
||||||
|
LAYER alpine3.9-tomcat8.5 8.5.41-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install full-featured wget to work around sourceforge bugs
|
# Install full-featured wget to work around sourceforge bugs
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "Mifos X",
|
|
||||||
"desc-cs": "Mikrofinancování rozvojových projektů",
|
|
||||||
"desc-en": "Mikrofinancování rozvojových projektů",
|
|
||||||
"lxcpath": "mifosx",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-tomcat8.5", "mariadb"]
|
|
||||||
}
|
|
@ -1,8 +1,14 @@
|
|||||||
IMAGE motech
|
IMAGE motech 1.3.0-190620
|
||||||
LAYER shared/alpine3.9
|
META title Motech
|
||||||
LAYER shared/alpine3.9-java8
|
META desc-cs Automatizace komunikace
|
||||||
LAYER shared/alpine3.9-tomcat7
|
META desc-en Communication automation
|
||||||
LAYER motech/motech
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends activemq postgres
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-java8 8.212.04-190620
|
||||||
|
LAYER alpine3.9-tomcat7 7.0.94-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Download Motech
|
# Download Motech
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "Motech",
|
|
||||||
"desc-cs": "Automatizace komunikace",
|
|
||||||
"desc-en": "Automatizace komunikace",
|
|
||||||
"lxcpath": "motech",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-tomcat7", "activemq", "postgres"]
|
|
||||||
}
|
|
@ -1,8 +1,14 @@
|
|||||||
IMAGE odoo
|
IMAGE odoo 12.0.0-190620
|
||||||
LAYER shared/alpine3.9
|
META title Odoo
|
||||||
LAYER shared/alpine3.9-python3.6
|
META desc-cs Sada aplikací pro správu organizace
|
||||||
LAYER shared/alpine3.9-nodejs10
|
META desc-en Company management application suite
|
||||||
LAYER odoo/odoo
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-python3.6 3.6.8-190620
|
||||||
|
LAYER alpine3.9-nodejs10 10.14.2-190620
|
||||||
|
|
||||||
FIXLAYER /usr/bin/fix-apk
|
FIXLAYER /usr/bin/fix-apk
|
||||||
|
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "Odoo",
|
|
||||||
"desc-cs": "Sada aplikací pro správu organizace",
|
|
||||||
"desc-en": "Sada aplikací pro správu organizace",
|
|
||||||
"lxcpath": "odoo",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-python3.6", "alpine3.9-nodejs10", "postgres"]
|
|
||||||
}
|
|
@ -1,8 +1,14 @@
|
|||||||
IMAGE opendatakit-build
|
IMAGE opendatakit-build 0.3.5-190620
|
||||||
LAYER shared/alpine3.9
|
META title OpenDataKit Build
|
||||||
LAYER shared/alpine3.9-ruby2.4
|
META desc-cs Sběr formulářových dat - návrh formulářů
|
||||||
LAYER shared/alpine3.9-nodejs10
|
META desc-en Form data collection - Form designer
|
||||||
LAYER opendatakit-build/opendatakit-build
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-ruby2.4 2.4.5-190620
|
||||||
|
LAYER alpine3.9-nodejs10 10.14.2-190620
|
||||||
|
|
||||||
FIXLAYER /usr/bin/fix-apk
|
FIXLAYER /usr/bin/fix-apk
|
||||||
|
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "OpenDataKit Build",
|
|
||||||
"desc-cs": "Sběr formulářových dat - Aplikace pro návrh formulářů",
|
|
||||||
"desc-en": "Sběr formulářových dat - Aplikace pro návrh formulářů",
|
|
||||||
"lxcpath": "opendatakit-build",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-ruby2.4", "alpine3.9-nodejs10", "postgres"]
|
|
||||||
}
|
|
@ -1,8 +1,14 @@
|
|||||||
IMAGE opendatakit
|
IMAGE opendatakit 2.0.3-190620
|
||||||
LAYER shared/alpine3.9
|
META title OpenDataKit
|
||||||
LAYER shared/alpine3.9-java8
|
META desc-cs Sběr formulářových dat
|
||||||
LAYER shared/alpine3.9-tomcat8.5
|
META desc-en Form data collection
|
||||||
LAYER opendatakit/opendatakit
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-java8 8.212.04-190620
|
||||||
|
LAYER alpine3.9-tomcat8.5 8.5.41-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Download OpenDataKit
|
# Download OpenDataKit
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "OpenDataKit",
|
|
||||||
"desc-cs": "Sběr formulářových dat",
|
|
||||||
"desc-en": "Sběr formulářových dat",
|
|
||||||
"lxcpath": "opendatakit",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-tomcat8.5", "postgres"]
|
|
||||||
}
|
|
@ -1,9 +1,14 @@
|
|||||||
IMAGE openmapkit
|
IMAGE openmapkit 0.12.0-190620
|
||||||
LAYER shared/alpine3.9
|
META title OpenMapKit
|
||||||
LAYER shared/alpine3.9-java8
|
META desc-cs Sběr mapových dat
|
||||||
LAYER shared/alpine3.9-python2.7
|
META desc-en Map data collection
|
||||||
LAYER shared/alpine3.9-nodejs10
|
META type app
|
||||||
LAYER openmapkit/openmapkit
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-java8 8.212.04-190620
|
||||||
|
LAYER alpine3.9-python2.7 2.7.16-190620
|
||||||
|
LAYER alpine3.9-nodejs10 10.14.2-190620
|
||||||
|
|
||||||
FIXLAYER /usr/bin/fix-apk
|
FIXLAYER /usr/bin/fix-apk
|
||||||
|
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "OpenMapKit",
|
|
||||||
"desc-cs": "Sběr mapových dat",
|
|
||||||
"desc-en": "Sběr mapových dat",
|
|
||||||
"lxcpath": "openmapkit",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-java8", "alpine3.9-python2.7", "alpine3.9-nodejs10", "postgres"]
|
|
||||||
}
|
|
@ -1,7 +1,13 @@
|
|||||||
IMAGE pandora
|
IMAGE pandora 0.0.1-190620
|
||||||
LAYER shared/alpine3.9
|
META title Pan.do/ra
|
||||||
LAYER shared/alpine3.9-python3.6
|
META desc-cs Archiv medií
|
||||||
LAYER pandora/pandora
|
META desc-en Media archive
|
||||||
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres rabbitmq
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-python3.6 3.6.8-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install runtime dependencies
|
# Install runtime dependencies
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "Pan.do/ra",
|
|
||||||
"desc-cs": "Archiv medií",
|
|
||||||
"desc-en": "Media archive",
|
|
||||||
"lxcpath": "pandora",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-python3.6", "postgres", "rabbitmq"]
|
|
||||||
}
|
|
@ -1,8 +1,14 @@
|
|||||||
IMAGE sahana-demo
|
IMAGE sahana-demo 0.0.1-190620
|
||||||
LAYER shared/alpine3.9
|
META title Sahana Eden - Demo
|
||||||
LAYER shared/alpine3.9-python2.7
|
META desc-cs Řízení humanítární činnosti - Demo instance
|
||||||
LAYER shared/sahana
|
META desc-en Management of humanitarian activities - Demo instance
|
||||||
LAYER sahana-demo/sahana-demo
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-python2.7 2.7.16-190620
|
||||||
|
LAYER sahana-shared 0.0.1-190620
|
||||||
|
|
||||||
MOUNT DIR /srv/sahana-demo/conf srv/web2py/applications/eden/models
|
MOUNT DIR /srv/sahana-demo/conf srv/web2py/applications/eden/models
|
||||||
MOUNT DIR /srv/sahana-demo/data/default srv/web2py/applications/eden/modules/templates/default
|
MOUNT DIR /srv/sahana-demo/data/default srv/web2py/applications/eden/modules/templates/default
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "Sahana Eden - Demo",
|
|
||||||
"desc-cs": "Řízení humanítární činnosti - Ukázková instance",
|
|
||||||
"desc-en": "Řízení humanítární činnosti - Ukázková instance",
|
|
||||||
"lxcpath": "sahana-demo",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["sahana-shared", "postgres"]
|
|
||||||
}
|
|
@ -1,7 +1,12 @@
|
|||||||
IMAGE sahana
|
IMAGE sahana-shared 0.0.1-190620
|
||||||
LAYER shared/alpine3.9
|
META title Sahana Eden - Shared layer
|
||||||
LAYER shared/alpine3.9-python2.7
|
META desc-cs Řízení humanítární činnosti - sdílená vrstva
|
||||||
LAYER shared/sahana
|
META desc-en Management of humanitarian activities - shared layer
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-python2.7 2.7.16-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install runtime dependencies
|
# Install runtime dependencies
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Řízení humanítární činnosti - Sdílená vrstva",
|
|
||||||
"desc-en": "Řízení humanítární činnosti - Sdílená vrstva",
|
|
||||||
"lxcpath": "shared/sahana",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-python2.7"]
|
|
||||||
}
|
|
@ -1,8 +1,14 @@
|
|||||||
IMAGE sahana
|
IMAGE sahana 0.0.1-190620
|
||||||
LAYER shared/alpine3.9
|
META title Sahana Eden
|
||||||
LAYER shared/alpine3.9-python2.7
|
META desc-cs Řízení humanítární činnosti
|
||||||
LAYER shared/sahana
|
META desc-en Management of humanitarian activities
|
||||||
LAYER sahana/sahana
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-python2.7 2.7.16-190620
|
||||||
|
LAYER sahana-shared 0.0.1-190620
|
||||||
|
|
||||||
MOUNT DIR /srv/sahana/conf srv/web2py/applications/eden/models
|
MOUNT DIR /srv/sahana/conf srv/web2py/applications/eden/models
|
||||||
MOUNT DIR /srv/sahana/data/Spotter srv/web2py/applications/eden/modules/templates/Spotter
|
MOUNT DIR /srv/sahana/data/Spotter srv/web2py/applications/eden/modules/templates/Spotter
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "Sahana Eden",
|
|
||||||
"desc-cs": "Řízení humanítární činnosti",
|
|
||||||
"desc-en": "Řízení humanítární činnosti",
|
|
||||||
"lxcpath": "sahana",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["sahana-shared", "postgres"]
|
|
||||||
}
|
|
@ -1,8 +1,14 @@
|
|||||||
IMAGE sambro
|
IMAGE sambro 0.0.1-190620
|
||||||
LAYER shared/alpine3.9
|
META title Sahana Eden - SAMBRO
|
||||||
LAYER shared/alpine3.9-python2.7
|
META desc-cs Řízení humanítární činnosti - Centrum hlášení a výstrah
|
||||||
LAYER shared/sahana
|
META desc-en Management of humanitarian activities - Reporting and alerting center
|
||||||
LAYER sambro/sambro
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-python2.7 2.7.16-190620
|
||||||
|
LAYER sahana-shared 0.0.1-190620
|
||||||
|
|
||||||
MOUNT DIR /srv/sambro/conf srv/web2py/applications/eden/models
|
MOUNT DIR /srv/sambro/conf srv/web2py/applications/eden/models
|
||||||
MOUNT DIR /srv/sambro/data/SAMBRO srv/web2py/applications/eden/modules/templates/SAMBRO
|
MOUNT DIR /srv/sambro/data/SAMBRO srv/web2py/applications/eden/modules/templates/SAMBRO
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "Sahana Eden - SAMBRO",
|
|
||||||
"desc-cs": "Centrum hlášení a výstrah",
|
|
||||||
"desc-en": "Centrum hlášení a výstrah",
|
|
||||||
"lxcpath": "sambro",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["sahana-shared", "postgres"]
|
|
||||||
}
|
|
@ -1,8 +1,14 @@
|
|||||||
IMAGE seeddms
|
IMAGE seeddms 5.1.9-190620
|
||||||
LAYER shared/alpine3.9
|
META title SeedDMS
|
||||||
LAYER shared/alpine3.9-php7.2
|
META desc-cs Archiv dokumentace
|
||||||
LAYER shared/alpine3.9-python3.6
|
META desc-en Document management system
|
||||||
LAYER seeddms/seeddms
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-php7.2 7.2.19-190620
|
||||||
|
LAYER alpine3.9-python3.6 3.6.8-190620
|
||||||
|
|
||||||
FIXLAYER /usr/bin/fix-apk
|
FIXLAYER /usr/bin/fix-apk
|
||||||
|
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "SeedDMS",
|
|
||||||
"desc-cs": "Archiv dokumentace",
|
|
||||||
"desc-en": "Archiv dokumentace",
|
|
||||||
"lxcpath": "seeddms",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-php7.2", "alpine3.9-python3.6", "postgres"]
|
|
||||||
}
|
|
@ -1,8 +1,14 @@
|
|||||||
IMAGE sigmah
|
IMAGE sigmah 2.0.2-190620
|
||||||
LAYER shared/alpine3.9
|
META title Sigmah
|
||||||
LAYER shared/alpine3.9-java8
|
META desc-cs Finanční řízení sbírek
|
||||||
LAYER shared/alpine3.9-tomcat8.5
|
META desc-en Donation management
|
||||||
LAYER sigmah/sigmah
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends postgres
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-java8 8.212.04-190620
|
||||||
|
LAYER alpine3.9-tomcat8.5 8.5.41-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Download Sigmah
|
# Download Sigmah
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "Sigmah",
|
|
||||||
"desc-cs": "Finanční řízení sbírek",
|
|
||||||
"desc-en": "Finanční řízení sbírek",
|
|
||||||
"lxcpath": "sigmah",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-tomcat8.5", "postgres"]
|
|
||||||
}
|
|
@ -1,7 +1,13 @@
|
|||||||
IMAGE ushahidi
|
IMAGE ushahidi 3.12.3-190620
|
||||||
LAYER shared/alpine3.9
|
META title Sigmah
|
||||||
LAYER shared/alpine3.9-php7.2
|
META desc-cs Skupinová reakce na události
|
||||||
LAYER ushahidi/ushahidi
|
META desc-en Group reaction to events
|
||||||
|
META type app
|
||||||
|
META license GPL
|
||||||
|
META depends mariadb
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-php7.2 7.2.19-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install runtime dependencies
|
# Install runtime dependencies
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"title": "Ushahidi",
|
|
||||||
"desc-cs": "Skupinová reakce na události",
|
|
||||||
"desc-en": "Skupinová reakce na události",
|
|
||||||
"lxcpath": "ushahidi",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-php7.2", "mariadb"]
|
|
||||||
}
|
|
@ -1,7 +1,12 @@
|
|||||||
IMAGE activemq
|
IMAGE activemq 5.15.9-190620
|
||||||
LAYER shared/alpine3.9
|
META title ActiveMQ
|
||||||
LAYER shared/alpine3.9-java8
|
META desc-cs ActveMQ message broker
|
||||||
LAYER activemq/activemq
|
META desc-en ActveMQ message broker
|
||||||
|
META type service
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-java8 8.212.04-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Download and install ActiveMQ
|
# Download and install ActiveMQ
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "ActiveMQ",
|
|
||||||
"desc-en": "ActiveMQ",
|
|
||||||
"lxcpath": "activemq",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-java8"]
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE mariadb
|
IMAGE mariadb 10.3.15-190620
|
||||||
LAYER shared/alpine3.9
|
META title MariaDB
|
||||||
LAYER mariadb/mariadb
|
META desc-cs Relační databázový systém kompatibilní s MySQL
|
||||||
|
META desc-en MySQL-compatible relational database management system
|
||||||
|
META type service
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Create OS user (which will be picked up later by apk add)
|
# Create OS user (which will be picked up later by apk add)
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "MariaDB",
|
|
||||||
"desc-en": "MariaDB",
|
|
||||||
"lxcpath": "mariadb",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9"]
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE postgres
|
IMAGE postgres 11.3.0-190620
|
||||||
LAYER shared/alpine3.9
|
META title PostgreSQL
|
||||||
LAYER postgres/postgres
|
META desc-cs Relační databázový systém s podporou pro geografické objekty
|
||||||
|
META desc-en Relational database management system with support for geographic objects
|
||||||
|
META type service
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Modify OS user (which will be picked up later by apk add)
|
# Modify OS user (which will be picked up later by apk add)
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "PostgreSQL",
|
|
||||||
"desc-en": "PostgreSQL",
|
|
||||||
"lxcpath": "postgres",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9"]
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE rabbitmq
|
IMAGE rabbitmq 3.7.11-190620
|
||||||
LAYER shared/alpine3.9
|
META title RabbitMQ
|
||||||
LAYER rabbitmq/rabbitmq
|
META desc-cs Multiprotokolový message broker
|
||||||
|
META desc-en Multi-protocol message broker
|
||||||
|
META type service
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Create OS user (which will be picked up later by apk add)
|
# Create OS user (which will be picked up later by apk add)
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "RabbitMQ",
|
|
||||||
"desc-en": "RabbitMQ",
|
|
||||||
"lxcpath": "rabbitmq",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9"]
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE redis
|
IMAGE redis 4.0.12-190620
|
||||||
LAYER shared/alpine3.9
|
META title Redis
|
||||||
LAYER redis/redis
|
META desc-cs Pokročilá key-value databáze
|
||||||
|
META desc-en Advanced key-value store
|
||||||
|
META type service
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Create OS user (which will be picked up later by apk add)
|
# Create OS user (which will be picked up later by apk add)
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Redis",
|
|
||||||
"desc-en": "Redis",
|
|
||||||
"lxcpath": "redis",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9"]
|
|
||||||
}
|
|
@ -1,7 +1,12 @@
|
|||||||
IMAGE solr
|
IMAGE solr 6.5.1-190620
|
||||||
LAYER shared/alpine3.9
|
META title Solr
|
||||||
LAYER shared/alpine3.9-java8
|
META desc-cs Platforma pro fulltextové a fasetové vyhledávání
|
||||||
LAYER solr/solr
|
META desc-en Fulltext and faceted search platform
|
||||||
|
META type service
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-java8 8.212.04-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install runtime dependencies
|
# Install runtime dependencies
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Solr",
|
|
||||||
"desc-en": "Solr",
|
|
||||||
"lxcpath": "solr",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-java8"]
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.8-nodejs8 8.14.0-190620
|
||||||
LAYER shared/alpine3.8
|
META title Alpine 3.8 Node.js 8
|
||||||
LAYER shared/alpine3.8-nodejs8
|
META desc-cs Základní LXC vrstva s běhovým prostředím pro Node.js 8
|
||||||
|
META desc-en Basic LXC layer with Node.js 8 runtime environment
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.8 3.8.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
apk --no-cache add nodejs
|
apk --no-cache add nodejs
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s běhovým prostředím pro Node.js 8",
|
|
||||||
"desc-en": "Basic LXC layer with Node.js 8 runtime environment",
|
|
||||||
"lxcpath": "shared/alpine3.8-nodejs8",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.8"]
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.8-php5.6 5.6.40-190620
|
||||||
LAYER shared/alpine3.8
|
META title Alpine 3.8 PHP 5.6
|
||||||
LAYER shared/alpine3.8-php5.6
|
META desc-cs Základní LXC vrstva s běhovým prostředím pro PHP 5.6
|
||||||
|
META desc-en Basic LXC layer with PHP 5.6 runtime environment
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.8 3.8.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
apk --no-cache add nginx php5 php5-ctype php5-fpm php5-gd php5-json php5-mcrypt php5-opcache
|
apk --no-cache add nginx php5 php5-ctype php5-fpm php5-gd php5-json php5-mcrypt php5-opcache
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s běhovým prostředím pro PHP 5",
|
|
||||||
"desc-en": "Basic LXC layer with PHP 5 runtime environment",
|
|
||||||
"lxcpath": "shared/alpine3.8-php5.6",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.8"]
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.8-ruby2.4 2.4.5-190620
|
||||||
LAYER shared/alpine3.8
|
META title Alpine 3.8 Ruby 2.4
|
||||||
LAYER shared/alpine3.8-ruby2.4
|
META desc-cs Základní LXC vrstva s běhovým prostředím pro Ruby 2.4
|
||||||
|
META desc-en Basic LXC layer with Ruby 2.4 runtime environment
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.8 3.8.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install Ruby runtime dependencies
|
# Install Ruby runtime dependencies
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s běhovým prostředím pro Ruby 2.4",
|
|
||||||
"desc-en": "Basic LXC layer with Ruby 2.4 runtime environment",
|
|
||||||
"lxcpath": "shared/alpine3.8-ruby2.4",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.8"]
|
|
||||||
}
|
|
@ -1,5 +1,10 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.8 3.8.4-190620
|
||||||
LAYER shared/alpine3.8
|
META title Alpine 3.8
|
||||||
|
META desc-cs Základní LXC vrstva s Alpine linuxem 3.8
|
||||||
|
META desc-en Basic LXC layer with Alpine linux 3.8
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
COPY https://github.com/gliderlabs/docker-alpine/raw/rootfs/library-3.8/x86_64/versions/library-3.8/x86_64/rootfs.tar.xz
|
COPY https://github.com/gliderlabs/docker-alpine/raw/rootfs/library-3.8/x86_64/versions/library-3.8/x86_64/rootfs.tar.xz
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s Alpine linuxem",
|
|
||||||
"desc-en": "Basic LXC layer with Alpine linux",
|
|
||||||
"lxcpath": "shared/alpine3.8",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": []
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.9-java8 8.212.04-190620
|
||||||
LAYER shared/alpine3.9
|
META title Alpine 3.9 OpenJDK 8
|
||||||
LAYER shared/alpine3.9-java8
|
META desc-cs Základní LXC vrstva s běhovým prostředím pro Javu 8
|
||||||
|
META desc-en Basic LXC layer with Java 8 runtime environment
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# nss needed due to https://github.com/docker-library/openjdk/issues/289 , https://bugs.alpinelinux.org/issues/10126
|
# nss needed due to https://github.com/docker-library/openjdk/issues/289 , https://bugs.alpinelinux.org/issues/10126
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s běhovým prostředím pro Javu",
|
|
||||||
"desc-en": "Basic LXC layer with Java runtime environment",
|
|
||||||
"lxcpath": "shared/alpine3.9-java8",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9"]
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.9-nodejs10 10.14.2-190620
|
||||||
LAYER shared/alpine3.9
|
META title Alpine 3.9 Node.js 10
|
||||||
LAYER shared/alpine3.9-nodejs10
|
META desc-cs Základní LXC vrstva s běhovým prostředím pro Node.js 10
|
||||||
|
META desc-en Basic LXC layer with Node.js 10 runtime environment
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
apk --no-cache add nodejs
|
apk --no-cache add nodejs
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s běhovým prostředím pro Node.js 10",
|
|
||||||
"desc-en": "Basic LXC layer with Node.js 10 runtime environment",
|
|
||||||
"lxcpath": "shared/alpine3.9-nodejs10",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9"]
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.9-php7.2 7.2.19-190620
|
||||||
LAYER shared/alpine3.9
|
META title Alpine 3.9 PHP 7.2
|
||||||
LAYER shared/alpine3.9-php7.2
|
META desc-cs Základní LXC vrstva s běhovým prostředím pro PHP 7.2
|
||||||
|
META desc-en Basic LXC layer with PHP 7.2 runtime environment
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
apk --no-cache add nginx php7 php7-ctype php7-fpm php7-gd php7-json php7-mbstring php7-mcrypt php7-opcache php7-session
|
apk --no-cache add nginx php7 php7-ctype php7-fpm php7-gd php7-json php7-mbstring php7-mcrypt php7-opcache php7-session
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s běhovým prostředím pro PHP 7",
|
|
||||||
"desc-en": "Basic LXC layer with PHP 7 runtime environment",
|
|
||||||
"lxcpath": "shared/alpine3.9-php7.2",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9"]
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.9-python2.7 2.7.16-190620
|
||||||
LAYER shared/alpine3.9
|
META title Alpine 3.9 python 2.7
|
||||||
LAYER shared/alpine3.9-python2.7
|
META desc-cs Základní LXC vrstva s běhovým prostředím pro python 2.7
|
||||||
|
META desc-en Basic LXC layer with python 2.7 runtime environment
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
apk --no-cache add python2
|
apk --no-cache add python2
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s běhovým prostředím pro python 2",
|
|
||||||
"desc-en": "Basic LXC layer with python 2 runtime environment",
|
|
||||||
"lxcpath": "shared/alpine3.9-python2.7",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9"]
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.9-python3.6 3.6.8-190620
|
||||||
LAYER shared/alpine3.9
|
META title Alpine 3.9 python 3.6
|
||||||
LAYER shared/alpine3.9-python3.6
|
META desc-cs Základní LXC vrstva s běhovým prostředím pro python 3.6
|
||||||
|
META desc-en Basic LXC layer with python 3.6 runtime environment
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
apk --no-cache add python3
|
apk --no-cache add python3
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s běhovým prostředím pro python 3",
|
|
||||||
"desc-en": "Basic LXC layer with python 3 runtime environment",
|
|
||||||
"lxcpath": "shared/alpine3.9-python3.6",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9"]
|
|
||||||
}
|
|
@ -1,6 +1,11 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.9-ruby2.4 2.4.5-190620
|
||||||
LAYER shared/alpine3.9
|
META title Alpine 3.9 Ruby 2.4
|
||||||
LAYER shared/alpine3.9-ruby2.4
|
META desc-cs Základní LXC vrstva s běhovým prostředím pro Ruby 2.4
|
||||||
|
META desc-en Basic LXC layer with Ruby 2.4 runtime environment
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install Ruby runtime dependencies
|
# Install Ruby runtime dependencies
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s běhovým prostředím pro Ruby 2.4",
|
|
||||||
"desc-en": "Basic LXC layer with Ruby 2.4 runtime environment",
|
|
||||||
"lxcpath": "shared/alpine3.9-ruby2.4",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9"]
|
|
||||||
}
|
|
@ -1,7 +1,12 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.9-tomcat7 7.0.94-190620
|
||||||
LAYER shared/alpine3.9
|
META title Alpine 3.9 Tomcat 7
|
||||||
LAYER shared/alpine3.9-java8
|
META desc-cs Základní LXC vrstva s JSP a servlet kontejnerem Tomcat 7
|
||||||
LAYER shared/alpine3.9-tomcat7
|
META desc-en Basic LXC layer with Tomcat 7 JSP and servlet container
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-java8 8.212.04-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install Tomcat 7
|
# Install Tomcat 7
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s JSP a servlet kontejnerem Tomcat 8",
|
|
||||||
"desc-en": "Basic LXC layer with Tomcat 8 JSP and servlet container",
|
|
||||||
"lxcpath": "shared/alpine3.9-tomcat7",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-java8"]
|
|
||||||
}
|
|
@ -1,7 +1,12 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.9-tomcat8.5 8.5.41-190620
|
||||||
LAYER shared/alpine3.9
|
META title Alpine 3.9 Tomcat 8.5
|
||||||
LAYER shared/alpine3.9-java8
|
META desc-cs Základní LXC vrstva s JSP a servlet kontejnerem Tomcat 8.5
|
||||||
LAYER shared/alpine3.9-tomcat8.5
|
META desc-en Basic LXC layer with Tomcat 8.5 JSP and servlet container
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
LAYER alpine3.9 3.9.4-190620
|
||||||
|
LAYER alpine3.9-java8 8.212.04-190620
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
# Install Tomcat 8.5
|
# Install Tomcat 8.5
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s JSP a servlet kontejnerem Tomcat 8.5",
|
|
||||||
"desc-en": "Basic LXC layer with Tomcat 8.5 JSP and servlet container",
|
|
||||||
"lxcpath": "shared/alpine3.9-tomcat8.5",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": ["alpine3.9-java8"]
|
|
||||||
}
|
|
@ -1,7 +1,11 @@
|
|||||||
IMAGE build
|
IMAGE alpine3.9 3.9.4-190620
|
||||||
LAYER shared/alpine3.9
|
META title Alpine 3.9
|
||||||
COPY https://github.com/gliderlabs/docker-alpine/raw/rootfs/library-3.9/x86_64/versions/library-3.9/x86_64/rootfs.tar.xz
|
META desc-cs Základní LXC vrstva s Alpine linuxem 3.9
|
||||||
|
META desc-en Basic LXC layer with Alpine linux 3.9
|
||||||
|
META type layer
|
||||||
|
META license GPL
|
||||||
|
|
||||||
|
COPY https://github.com/gliderlabs/docker-alpine/raw/rootfs/library-3.9/x86_64/versions/library-3.9/x86_64/rootfs.tar.xz
|
||||||
COPY lxc
|
COPY lxc
|
||||||
|
|
||||||
RUN EOF
|
RUN EOF
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"desc-cs": "Základní LXC vrstva s Alpine linuxem",
|
|
||||||
"desc-en": "Basic LXC layer with Alpine linux",
|
|
||||||
"lxcpath": "shared/alpine3.9",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"release": "0",
|
|
||||||
"license": "GPL",
|
|
||||||
"depends": []
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user