@@ -487,17 +487,12 @@ func (engine *DockerTaskEngine) synchronizeContainerStatus(container *apicontain
487
487
// their state to the managed task's container channel.
488
488
func (engine * DockerTaskEngine ) checkTaskState (task * apitask.Task ) {
489
489
defer metrics .MetricsEngineGlobal .RecordTaskEngineMetric ("CHECK_TASK_STATE" )()
490
- taskContainers , ok := engine .state .ContainerMapByArn (task .Arn )
491
- if ! ok {
492
- seelog .Warnf ("Task engine [%s]: could not check task state; no task in state" , task .Arn )
493
- return
494
- }
495
490
for _ , container := range task .Containers {
496
- dockerContainer , ok := taskContainers [ container . Name ]
497
- if ! ok {
491
+ dockerID , err := engine . getDockerID ( task , container )
492
+ if err != nil {
498
493
continue
499
494
}
500
- status , metadata := engine .client .DescribeContainer (engine .ctx , dockerContainer . DockerID )
495
+ status , metadata := engine .client .DescribeContainer (engine .ctx , dockerID )
501
496
engine .tasksLock .RLock ()
502
497
managedTask , ok := engine .managedTasks [task .Arn ]
503
498
engine .tasksLock .RUnlock ()
@@ -1136,25 +1131,17 @@ func (engine *DockerTaskEngine) startContainer(task *apitask.Task, container *ap
1136
1131
client = client .WithVersion (dockerclient .DockerVersion (* container .DockerConfig .Version ))
1137
1132
}
1138
1133
1139
- containerMap , ok := engine .state . ContainerMapByArn (task . Arn )
1140
- if ! ok {
1134
+ dockerID , err := engine .getDockerID (task , container )
1135
+ if err != nil {
1141
1136
return dockerapi.DockerContainerMetadata {
1142
1137
Error : dockerapi.CannotStartContainerError {
1143
- FromError : errors . Errorf ( "Container belongs to unrecognized task %s" , task . Arn ) ,
1138
+ FromError : err ,
1144
1139
},
1145
1140
}
1146
1141
}
1147
1142
1148
- dockerContainer , ok := containerMap [container .Name ]
1149
- if ! ok {
1150
- return dockerapi.DockerContainerMetadata {
1151
- Error : dockerapi.CannotStartContainerError {
1152
- FromError : errors .Errorf ("Container not recorded as created" ),
1153
- },
1154
- }
1155
- }
1156
1143
startContainerBegin := time .Now ()
1157
- dockerContainerMD := client .StartContainer (engine .ctx , dockerContainer . DockerID , engine .cfg .ContainerStartTimeout )
1144
+ dockerContainerMD := client .StartContainer (engine .ctx , dockerID , engine .cfg .ContainerStartTimeout )
1158
1145
1159
1146
// Get metadata through container inspection and available task information then write this to the metadata file
1160
1147
// Performs this in the background to avoid delaying container start
@@ -1164,7 +1151,7 @@ func (engine *DockerTaskEngine) startContainer(task *apitask.Task, container *ap
1164
1151
engine .cfg .ContainerMetadataEnabled .Enabled () &&
1165
1152
! container .IsInternal () {
1166
1153
go func () {
1167
- err := engine .metadataManager .Update (engine .ctx , dockerContainer . DockerID , task , container .Name )
1154
+ err := engine .metadataManager .Update (engine .ctx , dockerID , task , container .Name )
1168
1155
if err != nil {
1169
1156
seelog .Warnf ("Task engine [%s]: failed to update metadata file for container %s: %v" ,
1170
1157
task .Arn , container .Name , err )
@@ -1217,7 +1204,7 @@ func (engine *DockerTaskEngine) startContainer(task *apitask.Task, container *ap
1217
1204
func (engine * DockerTaskEngine ) provisionContainerResources (task * apitask.Task , container * apicontainer.Container ) dockerapi.DockerContainerMetadata {
1218
1205
seelog .Infof ("Task engine [%s]: setting up container resources for container [%s]" ,
1219
1206
task .Arn , container .Name )
1220
- containerInspectOutput , err := engine .inspectContainerByName (task . Arn , container . Name )
1207
+ containerInspectOutput , err := engine .inspectContainer (task , container )
1221
1208
if err != nil {
1222
1209
return dockerapi.DockerContainerMetadata {
1223
1210
Error : ContainerNetworkingError {
@@ -1268,7 +1255,7 @@ func (engine *DockerTaskEngine) cleanupPauseContainerNetwork(task *apitask.Task,
1268
1255
seelog .Infof ("Task engine [%s]: waiting %s before cleaning up pause container." , task .Arn , delay )
1269
1256
engine .handleDelay (delay )
1270
1257
}
1271
- containerInspectOutput , err := engine .inspectContainerByName (task . Arn , container . Name )
1258
+ containerInspectOutput , err := engine .inspectContainer (task , container )
1272
1259
if err != nil {
1273
1260
return errors .Wrap (err , "engine: cannot cleanup task network namespace due to error inspecting pause container" )
1274
1261
}
@@ -1312,43 +1299,27 @@ func (engine *DockerTaskEngine) buildCNIConfigFromTaskContainer(
1312
1299
return cniConfig , nil
1313
1300
}
1314
1301
1315
- func (engine * DockerTaskEngine ) inspectContainerByName (taskArn , containerName string ) (* types.ContainerJSON , error ) {
1316
- containers , ok := engine .state .ContainerMapByArn (taskArn )
1317
- if ! ok {
1318
- return nil , errors .New ("engine: failed to find the pause container, no containers in the task" )
1319
- }
1320
-
1321
- pauseContainer , ok := containers [containerName ]
1322
- if ! ok {
1323
- return nil , errors .New ("engine: failed to find the pause container" )
1302
+ func (engine * DockerTaskEngine ) inspectContainer (task * apitask.Task , container * apicontainer.Container ) (* types.ContainerJSON , error ) {
1303
+ dockerID , err := engine .getDockerID (task , container )
1304
+ if err != nil {
1305
+ return nil , err
1324
1306
}
1325
- containerInspectOutput , err := engine .client .InspectContainer (
1326
- engine .ctx ,
1327
- pauseContainer .DockerName ,
1328
- dockerclient .InspectContainerTimeout ,
1329
- )
1330
1307
1331
- return containerInspectOutput , err
1308
+ return engine . client . InspectContainer ( engine . ctx , dockerID , dockerclient . InspectContainerTimeout )
1332
1309
}
1333
1310
1334
1311
func (engine * DockerTaskEngine ) stopContainer (task * apitask.Task , container * apicontainer.Container ) dockerapi.DockerContainerMetadata {
1335
1312
seelog .Infof ("Task engine [%s]: stopping container [%s]" , task .Arn , container .Name )
1336
- containerMap , ok := engine .state .ContainerMapByArn (task .Arn )
1337
- if ! ok {
1313
+
1314
+ dockerID , err := engine .getDockerID (task , container )
1315
+ if err != nil {
1338
1316
return dockerapi.DockerContainerMetadata {
1339
1317
Error : dockerapi.CannotStopContainerError {
1340
- FromError : errors . Errorf ( "Container belongs to unrecognized task %s" , task . Arn ) ,
1318
+ FromError : err ,
1341
1319
},
1342
1320
}
1343
1321
}
1344
1322
1345
- dockerContainer , ok := containerMap [container .Name ]
1346
- if ! ok {
1347
- return dockerapi.DockerContainerMetadata {
1348
- Error : dockerapi.CannotStopContainerError {FromError : errors .Errorf ("Container not recorded as created" )},
1349
- }
1350
- }
1351
-
1352
1323
// Cleanup the pause container network namespace before stop the container
1353
1324
if container .Type == apicontainer .ContainerCNIPause {
1354
1325
err := engine .cleanupPauseContainerNetwork (task , container )
@@ -1364,23 +1335,18 @@ func (engine *DockerTaskEngine) stopContainer(task *apitask.Task, container *api
1364
1335
apiTimeoutStopContainer = engine .cfg .DockerStopTimeout
1365
1336
}
1366
1337
1367
- return engine .client .StopContainer (engine .ctx , dockerContainer . DockerID , apiTimeoutStopContainer )
1338
+ return engine .client .StopContainer (engine .ctx , dockerID , apiTimeoutStopContainer )
1368
1339
}
1369
1340
1370
1341
func (engine * DockerTaskEngine ) removeContainer (task * apitask.Task , container * apicontainer.Container ) error {
1371
1342
seelog .Infof ("Task engine [%s]: removing container: %s" , task .Arn , container .Name )
1372
- containerMap , ok := engine .state .ContainerMapByArn (task .Arn )
1373
1343
1374
- if ! ok {
1375
- return errors .New ("No such task: " + task .Arn )
1376
- }
1377
-
1378
- dockerContainer , ok := containerMap [container .Name ]
1379
- if ! ok {
1380
- return errors .New ("No container named '" + container .Name + "' created in " + task .Arn )
1344
+ dockerID , err := engine .getDockerID (task , container )
1345
+ if err != nil {
1346
+ return err
1381
1347
}
1382
1348
1383
- return engine .client .RemoveContainer (engine .ctx , dockerContainer . DockerName , dockerclient .RemoveContainerTimeout )
1349
+ return engine .client .RemoveContainer (engine .ctx , dockerID , dockerclient .RemoveContainerTimeout )
1384
1350
}
1385
1351
1386
1352
// updateTaskUnsafe determines if a new transition needs to be applied to the
@@ -1497,3 +1463,24 @@ func getContainerHostIP(networkSettings *types.NetworkSettings) (string, bool) {
1497
1463
}
1498
1464
return "" , false
1499
1465
}
1466
+
1467
+ func (engine * DockerTaskEngine ) getDockerID (task * apitask.Task , container * apicontainer.Container ) (string , error ) {
1468
+ runtimeID := container .GetRuntimeID ()
1469
+ if runtimeID != "" {
1470
+ return runtimeID , nil
1471
+ }
1472
+ containerMap , ok := engine .state .ContainerMapByArn (task .Arn )
1473
+ if ! ok {
1474
+ return "" , errors .Errorf ("container name=%s belongs to unrecognized task taskArn=%s" , container .Name , task .Arn )
1475
+ }
1476
+
1477
+ dockerContainer , ok := containerMap [container .Name ]
1478
+ if ! ok {
1479
+ return "" , errors .Errorf ("container name=%s not recognized by agent" , container .Name )
1480
+ }
1481
+
1482
+ if dockerContainer .DockerID == "" {
1483
+ return dockerContainer .DockerName , nil
1484
+ }
1485
+ return dockerContainer .DockerID , nil
1486
+ }
0 commit comments