@@ -2,6 +2,7 @@ package convert
22
33import (
44 "fmt"
5+ "sort"
56 "time"
67
78 "github.com/docker/docker/api/types/container"
@@ -98,9 +99,9 @@ func convertService(
9899 Command : service .Entrypoint ,
99100 Args : service .Command ,
100101 Hostname : service .Hostname ,
101- Hosts : convertExtraHosts (service .ExtraHosts ),
102+ Hosts : sortStrings ( convertExtraHosts (service .ExtraHosts ) ),
102103 Healthcheck : healthcheck ,
103- Env : convertEnvironment (service .Environment ),
104+ Env : sortStrings ( convertEnvironment (service .Environment ) ),
104105 Labels : AddStackLabel (namespace , service .Labels ),
105106 Dir : service .WorkingDir ,
106107 User : service .User ,
@@ -125,6 +126,17 @@ func convertService(
125126 return serviceSpec , nil
126127}
127128
129+ func sortStrings (strs []string ) []string {
130+ sort .Strings (strs )
131+ return strs
132+ }
133+
134+ type byNetworkTarget []swarm.NetworkAttachmentConfig
135+
136+ func (a byNetworkTarget ) Len () int { return len (a ) }
137+ func (a byNetworkTarget ) Swap (i , j int ) { a [i ], a [j ] = a [j ], a [i ] }
138+ func (a byNetworkTarget ) Less (i , j int ) bool { return a [i ].Target < a [j ].Target }
139+
128140func convertServiceNetworks (
129141 networks map [string ]* composetypes.ServiceNetworkConfig ,
130142 networkConfigs networkMap ,
@@ -160,6 +172,9 @@ func convertServiceNetworks(
160172 Aliases : append (aliases , name ),
161173 })
162174 }
175+
176+ sort .Sort (byNetworkTarget (nets ))
177+
163178 return nets , nil
164179}
165180
@@ -294,6 +309,12 @@ func convertResources(source composetypes.Resources) (*swarm.ResourceRequirement
294309
295310}
296311
312+ type byPublishedPort []swarm.PortConfig
313+
314+ func (a byPublishedPort ) Len () int { return len (a ) }
315+ func (a byPublishedPort ) Swap (i , j int ) { a [i ], a [j ] = a [j ], a [i ] }
316+ func (a byPublishedPort ) Less (i , j int ) bool { return a [i ].PublishedPort < a [j ].PublishedPort }
317+
297318func convertEndpointSpec (source []string ) (* swarm.EndpointSpec , error ) {
298319 portConfigs := []swarm.PortConfig {}
299320 ports , portBindings , err := nat .ParsePortSpecs (source )
@@ -307,6 +328,9 @@ func convertEndpointSpec(source []string) (*swarm.EndpointSpec, error) {
307328 opts .ConvertPortToPortConfig (port , portBindings )... )
308329 }
309330
331+ // Sorting to make sure these are always in the same order
332+ sort .Sort (byPublishedPort (portConfigs ))
333+
310334 return & swarm.EndpointSpec {Ports : portConfigs }, nil
311335}
312336
0 commit comments