Add support for all possible port definitions in services

Signed-off-by: Pablo Carranza Velez <pablo@resin.io>
This commit is contained in:
Pablo Carranza Velez 2018-01-23 11:50:28 -08:00
parent cba3a8e5fe
commit 554d4789ff

View File

@ -10,6 +10,9 @@ Duration = require 'duration-js'
validRestartPolicies = [ 'no', 'always', 'on-failure', 'unless-stopped' ] validRestartPolicies = [ 'no', 'always', 'on-failure', 'unless-stopped' ]
# Adapted from https://github.com/docker/docker-py/blob/master/docker/utils/ports.py#L3
PORTS_REGEX = /^(?:(?:([a-fA-F\d.:]+):)?([\d]*)(?:-([\d]+))?:)?([\d]+)(?:-([\d]+))?(?:\/(udp|tcp))?$/
parseMemoryNumber = (numAsString, defaultVal) -> parseMemoryNumber = (numAsString, defaultVal) ->
m = numAsString?.toString().match(/^([0-9]+)([bkmg]?)$/) m = numAsString?.toString().match(/^([0-9]+)([bkmg]?)$/)
if !m? and defaultVal? if !m? and defaultVal?
@ -475,10 +478,19 @@ module.exports = class Service
portBindings = {} portBindings = {}
if @ports? if @ports?
for port in @ports for port in @ports
[ hostPort, containerPort ] = port.toString().split(':') m = port.match(PORTS_REGEX)
containerPort ?= hostPort if m? # Ignore invalid port mappings
exposedPorts[containerPort + '/tcp'] = {} [ _unused, host = '', external, externalEnd, internal, internalEnd, protocol = 'tcp' ] = m
portBindings[containerPort + '/tcp'] = [ { HostIp: '', HostPort: hostPort } ] external ?= internal
internalEnd ?= internal
externalEnd ?= external
externalRange = _.map([external..externalEnd], String)
internalRange = _.map([internal..internalEnd], String)
if externalRange.length == internalRange.length # Ignore invalid port mappings
for hostPort, ind in externalRange
containerPort = internalRange[ind]
exposedPorts["#{containerPort}/#{protocol}"] = {}
portBindings["#{containerPort}/#{protocol}"] = [ { HostIp: host, HostPort: hostPort } ]
if @expose? if @expose?
for port in @expose for port in @expose
exposedPorts[port + '/tcp'] = {} exposedPorts[port + '/tcp'] = {}