15 Commits

Author SHA1 Message Date
Red5d
0dfdac353f Merge pull request #36 from ostafen/master
Format properly date/datetime labels
2022-03-16 09:24:12 -04:00
Red5d
a8f00e0deb Merge pull request #37 from alexanderpetrenz/master
Adding Name Attribute to each Network
2022-03-16 08:45:53 -04:00
alexanderpetrenz
adf98bb062 Merge branch 'Red5d:master' into master 2022-03-11 09:26:21 +01:00
Alexander Petrenz
1af6b49233 added name attribute to every retrieved network 2022-03-11 08:59:55 +01:00
Alexander Petrenz
40aaf8e82c fixed network retrieval 2022-03-11 08:59:47 +01:00
Stefano
63810906f9 Format properly date/datetime labels 2022-03-10 20:45:35 +01:00
Red5d
e32c9d4275 Merge pull request #35 from ostafen/master
Fix ERROR: network must be a mapping, not an array.
2022-03-10 14:04:38 -05:00
Stefano
caa747b605 Fix ERROR: network must be a mapping, not an array. 2022-03-10 15:32:50 +01:00
Red5d
d783902265 Merge pull request #34 from alexanderpetrenz/master
command property: replace string concatenation by taking over given list
2022-03-09 08:10:19 -05:00
Alexander Petrenz
e6badd31c3 now collecting networks not present in every container 2022-03-08 15:49:49 +01:00
Alexander Petrenz
3f756235b2 command property: replace string concatenation by taking over given list 2022-03-08 14:33:33 +01:00
Red5d
b9c096dd94 Merge pull request #33 from moschlar/patch-1
Update autocompose.py
2022-03-07 14:50:04 -05:00
Moritz Schlarb
e7dbe41f23 Update autocompose.py
Print error message to stderr so that I will be seen when redirecting stdout to `docker-compose.yml`
2022-03-07 11:56:06 +01:00
Red5d
d976d520b4 Merge pull request #32 from hgghyxo/patch-1
Update README.md
2022-02-24 11:14:25 -05:00
hgghyxo
ec211717ed Update README.md
adding a oneliner to print out all containers
2022-02-24 11:49:46 +01:00
2 changed files with 30 additions and 10 deletions

View File

@@ -43,3 +43,6 @@ Use the new image to generate a docker-compose file from a running container or
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/red5d/docker-autocompose <container-name-or-id> <additional-names-or-ids>... docker run --rm -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/red5d/docker-autocompose <container-name-or-id> <additional-names-or-ids>...
To print out all containers in a docker-compose format:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/red5d/docker-autocompose $(docker ps -aq)

View File

@@ -1,5 +1,5 @@
#! /usr/bin/env python #! /usr/bin/env python
import datetime
import sys, argparse, pyaml, docker import sys, argparse, pyaml, docker
from collections import OrderedDict from collections import OrderedDict
@@ -10,10 +10,12 @@ def main():
args = parser.parse_args() args = parser.parse_args()
struct = {} struct = {}
networks = [] networks = {}
for cname in args.cnames: for cname in args.cnames:
cfile, networks = generate(cname) cfile, c_networks = generate(cname)
struct.update(cfile) struct.update(cfile)
networks.update(c_networks)
render(struct, args, networks) render(struct, args, networks)
@@ -26,13 +28,27 @@ def render(struct, args, networks):
pyaml.p(OrderedDict({'version': '"3"', 'services': struct, 'networks': networks})) pyaml.p(OrderedDict({'version': '"3"', 'services': struct, 'networks': networks}))
def is_date_or_time(s: str):
for parse_func in [datetime.date.fromisoformat, datetime.datetime.fromisoformat]:
try:
parse_func(s.rstrip('Z'))
return True
except ValueError:
pass
return False
def fix_label(label: str):
return f"'{label}'" if is_date_or_time(label) else label
def generate(cname): def generate(cname):
c = docker.from_env() c = docker.from_env()
try: try:
cid = [x.short_id for x in c.containers.list(all=True) if cname == x.name or x.short_id in cname][0] cid = [x.short_id for x in c.containers.list(all=True) if cname == x.name or x.short_id in cname][0]
except IndexError: except IndexError:
print("That container is not available.") print("That container is not available.", file=sys.stderr)
sys.exit(1) sys.exit(1)
cattrs = c.containers.get(cid).attrs cattrs = c.containers.get(cid).attrs
@@ -55,7 +71,7 @@ def generate(cname):
'environment': cattrs['Config']['Env'], 'environment': cattrs['Config']['Env'],
'extra_hosts': cattrs['HostConfig']['ExtraHosts'], 'extra_hosts': cattrs['HostConfig']['ExtraHosts'],
'image': cattrs['Config']['Image'], 'image': cattrs['Config']['Image'],
'labels': cattrs['Config']['Labels'], 'labels': {label: fix_label(value) for label, value in cattrs['Config']['Labels'].items()},
'links': cattrs['HostConfig']['Links'], 'links': cattrs['HostConfig']['Links'],
#'log_driver': cattrs['HostConfig']['LogConfig']['Type'], #'log_driver': cattrs['HostConfig']['LogConfig']['Type'],
#'log_opt': cattrs['HostConfig']['LogConfig']['Config'], #'log_opt': cattrs['HostConfig']['LogConfig']['Config'],
@@ -91,11 +107,12 @@ def generate(cname):
networklist = c.networks.list() networklist = c.networks.list()
for network in networklist: for network in networklist:
if network.attrs['Name'] in values['networks']: if network.attrs['Name'] in values['networks']:
networks[network.attrs['Name']] = {'external': (not network.attrs['Internal'])} networks[network.attrs['Name']] = {'external': (not network.attrs['Internal']),
'name': network.attrs['Name']}
# Check for command and add it if present. # Check for command and add it if present.
if cattrs['Config']['Cmd'] != None: if cattrs['Config']['Cmd'] is not None:
values['command'] = " ".join(cattrs['Config']['Cmd']), values['command'] = cattrs['Config']['Cmd']
# Check for exposed/bound ports and add them if needed. # Check for exposed/bound ports and add them if needed.
try: try: