@@ -506,6 +506,116 @@ env = ["persistence"]
506506 "lstk start should surface persistence state when LOCALSTACK_PERSISTENCE=1 is set in the config profile" )
507507}
508508
509+ func TestStartCommandDockerFlagsEnvVar (t * testing.T ) {
510+ requireDocker (t )
511+ _ = env .Require (t , env .AuthToken )
512+
513+ cleanup ()
514+ t .Cleanup (cleanup )
515+
516+ mockServer := createMockLicenseServer (true )
517+ defer mockServer .Close ()
518+
519+ ctx := testContext (t )
520+ _ , stderr , err := runLstk (t , ctx , "" ,
521+ env .Environ (testEnvWithHome (t .TempDir (), "" )).With (env .APIEndpoint , mockServer .URL ).With (env .DockerFlags , "-e SERVICES=s3,sqs" ),
522+ "start" )
523+ require .NoError (t , err , "lstk start failed: %s" , stderr )
524+
525+ inspect , err := dockerClient .ContainerInspect (ctx , containerName , client.ContainerInspectOptions {})
526+ require .NoError (t , err , "failed to inspect container" )
527+ envVars := containerEnvToMap (inspect .Container .Config .Env )
528+ assert .Equal (t , "s3,sqs" , envVars ["SERVICES" ],
529+ "SERVICES env var from DOCKER_FLAGS must be passed to the container" )
530+ }
531+
532+ func TestStartCommandDockerFlagsConfigToml (t * testing.T ) {
533+ requireDocker (t )
534+ _ = env .Require (t , env .AuthToken )
535+
536+ cleanup ()
537+ t .Cleanup (cleanup )
538+
539+ mockServer := createMockLicenseServer (true )
540+ defer mockServer .Close ()
541+
542+ configContent := `[[containers]]
543+ type = "aws"
544+ port = "4566"
545+ docker_flags = "-e SERVICES=s3,sqs"
546+ `
547+ configFile := filepath .Join (t .TempDir (), "config.toml" )
548+ require .NoError (t , os .WriteFile (configFile , []byte (configContent ), 0644 ))
549+
550+ ctx := testContext (t )
551+ _ , stderr , err := runLstk (t , ctx , "" ,
552+ env .Environ (testEnvWithHome (t .TempDir (), "" )).With (env .APIEndpoint , mockServer .URL ),
553+ "--config" , configFile , "start" )
554+ require .NoError (t , err , "lstk start failed: %s" , stderr )
555+
556+ inspect , err := dockerClient .ContainerInspect (ctx , containerName , client.ContainerInspectOptions {})
557+ require .NoError (t , err , "failed to inspect container" )
558+ envVars := containerEnvToMap (inspect .Container .Config .Env )
559+ assert .Equal (t , "s3,sqs" , envVars ["SERVICES" ],
560+ "SERVICES env var from docker_flags in config.toml must be passed to the container" )
561+ }
562+
563+ func TestStartCommandDockerFlagsVolumeMount (t * testing.T ) {
564+ requireDocker (t )
565+ _ = env .Require (t , env .AuthToken )
566+
567+ cleanup ()
568+ t .Cleanup (cleanup )
569+
570+ mockServer := createMockLicenseServer (true )
571+ defer mockServer .Close ()
572+
573+ tmpDir := t .TempDir ()
574+ ctx := testContext (t )
575+ _ , stderr , err := runLstk (t , ctx , "" ,
576+ env .Environ (testEnvWithHome (t .TempDir (), "" )).With (env .APIEndpoint , mockServer .URL ).With (env .DockerFlags , "-v " + tmpDir + ":/extra-mount" ),
577+ "start" )
578+ require .NoError (t , err , "lstk start failed: %s" , stderr )
579+
580+ inspect , err := dockerClient .ContainerInspect (ctx , containerName , client.ContainerInspectOptions {})
581+ require .NoError (t , err , "failed to inspect container" )
582+ assert .True (t , hasBindTarget (inspect .Container .HostConfig .Binds , "/extra-mount" ),
583+ "volume from DOCKER_FLAGS must be mounted in the container; got: %v" , inspect .Container .HostConfig .Binds )
584+ assert .True (t , hasBindSource (inspect .Container .HostConfig .Binds , tmpDir ),
585+ "volume source from DOCKER_FLAGS must match; got: %v" , inspect .Container .HostConfig .Binds )
586+ }
587+
588+ func TestStartCommandDockerFlagsMergeEnvAndConfig (t * testing.T ) {
589+ requireDocker (t )
590+ _ = env .Require (t , env .AuthToken )
591+
592+ cleanup ()
593+ t .Cleanup (cleanup )
594+
595+ mockServer := createMockLicenseServer (true )
596+ defer mockServer .Close ()
597+
598+ configContent := `[[containers]]
599+ type = "aws"
600+ port = "4566"
601+ docker_flags = "-e ENFORCE_IAM=1"
602+ `
603+ configFile := filepath .Join (t .TempDir (), "config.toml" )
604+ require .NoError (t , os .WriteFile (configFile , []byte (configContent ), 0644 ))
605+
606+ ctx := testContext (t )
607+ _ , stderr , err := runLstk (t , ctx , "" ,
608+ env .Environ (testEnvWithHome (t .TempDir (), "" )).With (env .APIEndpoint , mockServer .URL ).With (env .DockerFlags , "-e SERVICES=s3" ),
609+ "--config" , configFile , "start" )
610+ require .NoError (t , err , "lstk start failed: %s" , stderr )
611+
612+ inspect , err := dockerClient .ContainerInspect (ctx , containerName , client.ContainerInspectOptions {})
613+ require .NoError (t , err , "failed to inspect container" )
614+ envVars := containerEnvToMap (inspect .Container .Config .Env )
615+ assert .Equal (t , "s3" , envVars ["SERVICES" ], "SERVICES from DOCKER_FLAGS env var must be present" )
616+ assert .Equal (t , "1" , envVars ["ENFORCE_IAM" ], "ENFORCE_IAM from docker_flags config must be present" )
617+ }
618+
509619// hasBindTarget checks if any bind mount targets the given container path.
510620func hasBindTarget (binds []string , containerPath string ) bool {
511621 for _ , b := range binds {
0 commit comments