use ssh config when building from compose up

Signed-off-by: Guillaume Lours <guillaume.lours@docker.com>
This commit is contained in:
Guillaume Lours 2022-04-01 23:09:19 +02:00 committed by Nicolas De loof
parent fcff36fc8a
commit f2d9acd3d4
2 changed files with 25 additions and 15 deletions

View File

@ -63,7 +63,7 @@ func (s *composeService) build(ctx context.Context, project *types.Project, opti
if service.Build != nil { if service.Build != nil {
imageName := getImageName(service, project.Name) imageName := getImageName(service, project.Name)
imagesToBuild = append(imagesToBuild, imageName) imagesToBuild = append(imagesToBuild, imageName)
buildOptions, err := s.toBuildOptions(project, service, imageName) buildOptions, err := s.toBuildOptions(project, service, imageName, options.SSHs)
if err != nil { if err != nil {
return err return err
} }
@ -81,15 +81,6 @@ func (s *composeService) build(ctx context.Context, project *types.Project, opti
Attrs: map[string]string{"ref": image}, Attrs: map[string]string{"ref": image},
}) })
} }
if len(options.SSHs) > 0 || len(service.Build.SSH) > 0 {
sshAgentProvider, err := sshAgentProvider(append(service.Build.SSH, options.SSHs...))
if err != nil {
return err
}
buildOptions.Session = append(buildOptions.Session, sshAgentProvider)
}
opts[imageName] = buildOptions opts[imageName] = buildOptions
} }
} }
@ -168,7 +159,7 @@ func (s *composeService) getBuildOptions(project *types.Project, images map[stri
if localImagePresent && service.PullPolicy != types.PullPolicyBuild { if localImagePresent && service.PullPolicy != types.PullPolicyBuild {
continue continue
} }
opt, err := s.toBuildOptions(project, service, imageName) opt, err := s.toBuildOptions(project, service, imageName, []types.SSHKey{})
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -218,7 +209,7 @@ func (s *composeService) doBuild(ctx context.Context, project *types.Project, op
return s.doBuildBuildkit(ctx, project, opts, mode) return s.doBuildBuildkit(ctx, project, opts, mode)
} }
func (s *composeService) toBuildOptions(project *types.Project, service types.ServiceConfig, imageTag string) (build.Options, error) { func (s *composeService) toBuildOptions(project *types.Project, service types.ServiceConfig, imageTag string, sshKeys []types.SSHKey) (build.Options, error) {
var tags []string var tags []string
tags = append(tags, imageTag) tags = append(tags, imageTag)
@ -252,6 +243,17 @@ func (s *composeService) toBuildOptions(project *types.Project, service types.Se
return build.Options{}, err return build.Options{}, err
} }
sessionConfig := []session.Attachable{
authprovider.NewDockerAuthProvider(s.stderr()),
}
if len(sshKeys) > 0 || len(service.Build.SSH) > 0 {
sshAgentProvider, err := sshAgentProvider(append(service.Build.SSH, sshKeys...))
if err != nil {
return build.Options{}, err
}
sessionConfig = append(sessionConfig, sshAgentProvider)
}
return build.Options{ return build.Options{
Inputs: build.Inputs{ Inputs: build.Inputs{
ContextPath: service.Build.Context, ContextPath: service.Build.Context,
@ -269,9 +271,7 @@ func (s *composeService) toBuildOptions(project *types.Project, service types.Se
Labels: service.Build.Labels, Labels: service.Build.Labels,
NetworkMode: service.Build.Network, NetworkMode: service.Build.Network,
ExtraHosts: service.Build.ExtraHosts, ExtraHosts: service.Build.ExtraHosts,
Session: []session.Attachable{ Session: sessionConfig,
authprovider.NewDockerAuthProvider(s.stderr()),
},
}, nil }, nil
} }

View File

@ -121,6 +121,16 @@ func TestLocalComposeBuild(t *testing.T) {
}) })
}) })
t.Run("build succeed as part of up with ssh from Compose file", func(t *testing.T) {
c.RunDockerOrExitError("rmi", "build-test-ssh")
c.RunDockerComposeCmd("--project-directory", "fixtures/build-test/ssh", "up", "-d", "--build")
t.Cleanup(func() {
c.RunDockerComposeCmd("--project-directory", "fixtures/build-test/ssh", "down")
})
c.RunDockerCmd("image", "inspect", "build-test-ssh")
})
t.Run("build as part of up", func(t *testing.T) { t.Run("build as part of up", func(t *testing.T) {
c.RunDockerOrExitError("rmi", "build-test_nginx") c.RunDockerOrExitError("rmi", "build-test_nginx")
c.RunDockerOrExitError("rmi", "custom-nginx") c.RunDockerOrExitError("rmi", "custom-nginx")