@@ -24,10 +24,6 @@ import (
2424 log "github.com/sirupsen/logrus"
2525)
2626
27- const (
28- defaultMemLimit = 512
29- )
30-
3127// TaskDefParams contains basic fields to build an ECS task definition
3228type TaskDefParams struct {
3329 networkMode string
@@ -85,7 +81,11 @@ func ConvertToTaskDefinition(params ConvertTaskDefParams) (*ecs.TaskDefinition,
8581 return nil , errors .New ("Task definition does not have any essential containers" )
8682 }
8783
88- containerDef , err := convertToContainerDef (& containerConfig , ecsContainerDef )
84+ taskVals := taskLevelValues {
85+ MemLimit : taskDefParams .memory ,
86+ }
87+
88+ containerDef , err := reconcileContainerDef (& containerConfig , ecsContainerDef , taskVals )
8989 if err != nil {
9090 return nil , err
9191 }
@@ -150,135 +150,6 @@ func ConvertToTaskDefinition(params ConvertTaskDefParams) (*ecs.TaskDefinition,
150150 return taskDefinition , nil
151151}
152152
153- // convertToContainerDef transforms each service in docker-compose.yml and
154- // ecs-params.yml to an equivalent ECS container definition
155- func convertToContainerDef (inputCfg * adapter.ContainerConfig , ecsContainerDef * ContainerDef ) (* ecs.ContainerDefinition , error ) {
156- outputContDef := & ecs.ContainerDefinition {}
157-
158- // Populate ECS container definition, offloading the validation to aws-sdk
159- outputContDef .SetCommand (aws .StringSlice (inputCfg .Command ))
160- outputContDef .SetDnsSearchDomains (aws .StringSlice (inputCfg .DNSSearchDomains ))
161- outputContDef .SetDnsServers (aws .StringSlice (inputCfg .DNSServers ))
162- outputContDef .SetDockerLabels (inputCfg .DockerLabels )
163- outputContDef .SetDockerSecurityOptions (aws .StringSlice (inputCfg .DockerSecurityOptions ))
164- outputContDef .SetEntryPoint (aws .StringSlice (inputCfg .Entrypoint ))
165- outputContDef .SetEnvironment (inputCfg .Environment )
166- outputContDef .SetExtraHosts (inputCfg .ExtraHosts )
167- if inputCfg .Hostname != "" {
168- outputContDef .SetHostname (inputCfg .Hostname )
169- }
170- outputContDef .SetImage (inputCfg .Image )
171- outputContDef .SetLinks (aws .StringSlice (inputCfg .Links )) // TODO, read from external links
172- outputContDef .SetLogConfiguration (inputCfg .LogConfiguration )
173- outputContDef .SetMountPoints (inputCfg .MountPoints )
174- outputContDef .SetName (inputCfg .Name )
175- outputContDef .SetPrivileged (inputCfg .Privileged )
176- outputContDef .SetPortMappings (inputCfg .PortMappings )
177- outputContDef .SetReadonlyRootFilesystem (inputCfg .ReadOnly )
178- outputContDef .SetUlimits (inputCfg .Ulimits )
179-
180- if inputCfg .User != "" {
181- outputContDef .SetUser (inputCfg .User )
182- }
183- outputContDef .SetVolumesFrom (inputCfg .VolumesFrom )
184- if inputCfg .WorkingDirectory != "" {
185- outputContDef .SetWorkingDirectory (inputCfg .WorkingDirectory )
186- }
187-
188- // Set Linux Parameters
189- outputContDef .LinuxParameters = & ecs.LinuxParameters {Capabilities : & ecs.KernelCapabilities {}}
190- if inputCfg .CapAdd != nil {
191- outputContDef .LinuxParameters .Capabilities .SetAdd (aws .StringSlice (inputCfg .CapAdd ))
192- }
193- if inputCfg .CapDrop != nil {
194- outputContDef .LinuxParameters .Capabilities .SetDrop (aws .StringSlice (inputCfg .CapDrop ))
195- }
196- if inputCfg .Devices != nil {
197- outputContDef .LinuxParameters .SetDevices (inputCfg .Devices )
198- }
199-
200- // Only set shmSize if specified. Otherwise we expect this sharedMemorySize for the
201- // containerDefinition to be null; Docker will by default allocate 64M for shared memory if
202- // shmSize is null.
203- if inputCfg .ShmSize != 0 {
204- outputContDef .LinuxParameters .SetSharedMemorySize (inputCfg .ShmSize )
205- }
206-
207- // Only set tmpfs if tmpfs mounts are specified.
208- if inputCfg .Tmpfs != nil { // will never be nil?
209- outputContDef .LinuxParameters .SetTmpfs (inputCfg .Tmpfs )
210- }
211-
212- // initialize container resources from inputCfg
213- cpu := inputCfg .CPU
214- mem := inputCfg .Memory
215- memRes := inputCfg .MemoryReservation
216- healthCheck := inputCfg .HealthCheck
217-
218- // Set essential & resource fields from ecs-params file, if present
219- if ecsContainerDef != nil {
220- outputContDef .Essential = aws .Bool (ecsContainerDef .Essential )
221-
222- // CPU and Memory are expected to be set here if compose v3 was used
223- cpu = resolveIntResourceOverride (inputCfg .Name , cpu , ecsContainerDef .Cpu , "CPU" )
224-
225- ecsMemInMB := adapter .ConvertToMemoryInMB (int64 (ecsContainerDef .Memory ))
226- mem = resolveIntResourceOverride (inputCfg .Name , mem , ecsMemInMB , "MemoryLimit" )
227-
228- ecsMemResInMB := adapter .ConvertToMemoryInMB (int64 (ecsContainerDef .MemoryReservation ))
229-
230- memRes = resolveIntResourceOverride (inputCfg .Name , memRes , ecsMemResInMB , "MemoryReservation" )
231-
232- credParam := ecsContainerDef .RepositoryCredentials .CredentialsParameter
233-
234- if credParam != "" {
235- outputContDef .RepositoryCredentials = & ecs.RepositoryCredentials {}
236- outputContDef .RepositoryCredentials .SetCredentialsParameter (credParam )
237- }
238-
239- if len (ecsContainerDef .Secrets ) > 0 {
240- outputContDef .SetSecrets (convertToECSSecrets (ecsContainerDef .Secrets ))
241- }
242-
243- var err error
244- healthCheck , err = resolveHealthCheck (inputCfg .Name , healthCheck , ecsContainerDef .HealthCheck )
245- if err != nil {
246- return nil , err
247- }
248- }
249-
250- // One or both of memory and memoryReservation is required to register a task definition with ECS
251- // If neither is provided by 1) compose file or 2) ecs-params, set default
252- // NOTE: Docker does not set a memory limit for containers
253- if mem == 0 && memRes == 0 {
254- mem = defaultMemLimit
255- }
256-
257- // Docker compose allows specifying memory reservation with memory, so
258- // we should default to minimum allowable value for memory hard limit
259- if mem == 0 && memRes != 0 {
260- mem = memRes
261- }
262-
263- if mem < memRes {
264- return nil , errors .New ("mem_limit must be greater than mem_reservation" )
265- }
266-
267- outputContDef .SetCpu (cpu )
268- if mem != 0 {
269- outputContDef .SetMemory (mem )
270- }
271- if memRes != 0 {
272- outputContDef .SetMemoryReservation (memRes )
273- }
274-
275- if healthCheck != nil {
276- outputContDef .SetHealthCheck (healthCheck )
277- }
278-
279- return outputContDef , nil
280- }
281-
282153func resolveHealthCheck (serviceName string , healthCheck * ecs.HealthCheck , ecsParamsHealthCheck * HealthCheck ) (* ecs.HealthCheck , error ) {
283154 if ecsParamsHealthCheck != nil {
284155 healthCheckOverride , err := ecsParamsHealthCheck .ConvertToECSHealthCheck ()
0 commit comments