@@ -24,10 +24,6 @@ import (
24
24
log "github.com/sirupsen/logrus"
25
25
)
26
26
27
- const (
28
- defaultMemLimit = 512
29
- )
30
-
31
27
// TaskDefParams contains basic fields to build an ECS task definition
32
28
type TaskDefParams struct {
33
29
networkMode string
@@ -85,7 +81,11 @@ func ConvertToTaskDefinition(params ConvertTaskDefParams) (*ecs.TaskDefinition,
85
81
return nil , errors .New ("Task definition does not have any essential containers" )
86
82
}
87
83
88
- containerDef , err := convertToContainerDef (& containerConfig , ecsContainerDef )
84
+ taskVals := taskLevelValues {
85
+ MemLimit : taskDefParams .memory ,
86
+ }
87
+
88
+ containerDef , err := reconcileContainerDef (& containerConfig , ecsContainerDef , taskVals )
89
89
if err != nil {
90
90
return nil , err
91
91
}
@@ -150,135 +150,6 @@ func ConvertToTaskDefinition(params ConvertTaskDefParams) (*ecs.TaskDefinition,
150
150
return taskDefinition , nil
151
151
}
152
152
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
-
282
153
func resolveHealthCheck (serviceName string , healthCheck * ecs.HealthCheck , ecsParamsHealthCheck * HealthCheck ) (* ecs.HealthCheck , error ) {
283
154
if ecsParamsHealthCheck != nil {
284
155
healthCheckOverride , err := ecsParamsHealthCheck .ConvertToECSHealthCheck ()
0 commit comments