@@ -29,6 +29,8 @@ import (
29
29
"github.com/mayooot/gpu-docker-api/utils"
30
30
)
31
31
32
+ const ballastStone = "var/backups/ballaststone"
33
+
32
34
var lxcfsBind = []string {
33
35
"/var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw" ,
34
36
"/var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw" ,
@@ -236,10 +238,10 @@ func (rs *ReplicaSetService) ExecuteContainer(name string, exec *models.Containe
236
238
}
237
239
238
240
hijackedResp , err := docker .Cli .ContainerExecAttach (ctx , execCreate .ID , container.ExecAttachOptions {})
239
- defer hijackedResp .Close ()
240
241
if err != nil {
241
242
return resp , errors .Wrapf (err , "docker.ContainerExecAttach failed, name: %s, spec: %+v" , name , exec )
242
243
}
244
+ defer hijackedResp .Close ()
243
245
244
246
var buf bytes.Buffer
245
247
_ , _ = stdcopy .StdCopy (& buf , & buf , hijackedResp .Reader )
@@ -300,6 +302,11 @@ func (rs *ReplicaSetService) PatchContainer(name string, spec *models.PatchReque
300
302
return id , newContainerName , errors .WithMessage (err , "runContainer failed" )
301
303
}
302
304
305
+ err = rs .containerRemoveBallastStone (ctrVersionName )
306
+ if err != nil {
307
+ return id , newContainerName , errors .WithMessage (err , "removeContainerBallastStone failed" )
308
+ }
309
+
303
310
// copy the old container's merged files to the new container
304
311
err = utils .CopyOldMergedToNewContainerMerged (ctrVersionName , newContainerName )
305
312
if err != nil {
@@ -791,6 +798,11 @@ func (rs *ReplicaSetService) RestartContainer(name string) (id, newContainerName
791
798
return id , newContainerName , errors .WithMessage (err , "services.runContainer failed" )
792
799
}
793
800
801
+ err = rs .containerRemoveBallastStone (ctrVersionName )
802
+ if err != nil {
803
+ return id , newContainerName , errors .WithMessage (err , "removeContainerBallastStone failed" )
804
+ }
805
+
794
806
// copy the old container's merged files to the new container
795
807
err = utils .CopyOldMergedToNewContainerMerged (ctrVersionName , newContainerName )
796
808
if err != nil {
@@ -895,6 +907,14 @@ func (rs *ReplicaSetService) startContainer(ctx context.Context, respId, ctrVers
895
907
return errors .Wrapf (err , "docker.ContainerStart failed, id: %s, name: %s" , respId , ctrVersionName )
896
908
}
897
909
910
+ go func (name string ) {
911
+ time .Sleep (5 * time .Second )
912
+ err := rs .containerCreateBallastStone (name )
913
+ if err != nil {
914
+ log .Errorf ("services.containerCreateBallastStone failed, name: %s, err: %v" , name , err )
915
+ }
916
+ }(ctrVersionName )
917
+
898
918
return nil
899
919
}
900
920
@@ -962,3 +982,38 @@ func (rs *ReplicaSetService) containerMemory(name string) (int64, error) {
962
982
}
963
983
return resp .HostConfig .Resources .Memory , nil
964
984
}
985
+
986
+ func (rs * ReplicaSetService ) containerCreateBallastStone (name string ) error {
987
+ containerName := strings .Split (name , "-" )[0 ]
988
+
989
+ cmds := models.ContainerExecute {
990
+ Cmd : []string {
991
+ "dd" ,
992
+ "if=/dev/zero" ,
993
+ "of=/" + ballastStone ,
994
+ "bs=1M" ,
995
+ "count=5" , // 5MB
996
+ },
997
+ }
998
+
999
+ _ , err := rs .ExecuteContainer (containerName , & cmds )
1000
+ if err != nil {
1001
+ return errors .WithMessagef (err , "services.ExecuteContainer failed, container: %s" , containerName )
1002
+ }
1003
+
1004
+ return nil
1005
+ }
1006
+
1007
+ func (rs * ReplicaSetService ) containerRemoveBallastStone (name string ) error {
1008
+ mergedLayer , err := utils .GetContainerMergedLayer (name )
1009
+ if err != nil {
1010
+ return errors .WithMessagef (err , "utils.GetContainerMergedLayer failed, container: %s" , name )
1011
+ }
1012
+ err = os .Remove (mergedLayer + "/" + ballastStone )
1013
+ if err != nil {
1014
+ if err != os .ErrExist {
1015
+ return errors .WithMessagef (err , "remove container ballast stone failed, path: %s" , mergedLayer + "/" + ballastStone )
1016
+ }
1017
+ }
1018
+ return nil
1019
+ }
0 commit comments