mirror of
https://github.com/docker/compose.git
synced 2025-07-07 13:54:34 +02:00
as --no-build is set, set service image to default image name
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com> Signed-off-by: Guillaume Lours <guillaume.lours@docker.com>
This commit is contained in:
parent
085d8e9bb7
commit
abf5f736c7
@ -126,6 +126,9 @@ func (opts createOptions) Apply(project *types.Project) {
|
|||||||
if opts.noBuild {
|
if opts.noBuild {
|
||||||
for i, service := range project.Services {
|
for i, service := range project.Services {
|
||||||
service.Build = nil
|
service.Build = nil
|
||||||
|
if service.Image == "" {
|
||||||
|
service.Image = api.GetImageNameOrDefault(service, project.Name)
|
||||||
|
}
|
||||||
project.Services[i] = service
|
project.Services[i] = service
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -445,3 +445,12 @@ const (
|
|||||||
// UserCancel user cancelled compose up, we are stopping containers
|
// UserCancel user cancelled compose up, we are stopping containers
|
||||||
UserCancel
|
UserCancel
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// GetImageNameOrDefault computes the default image name for a service, used to tag built images
|
||||||
|
func GetImageNameOrDefault(service types.ServiceConfig, projectName string) string {
|
||||||
|
imageName := service.Image
|
||||||
|
if imageName == "" {
|
||||||
|
imageName = projectName + "_" + service.Name
|
||||||
|
}
|
||||||
|
return imageName
|
||||||
|
}
|
||||||
|
@ -64,7 +64,7 @@ func (s *composeService) build(ctx context.Context, project *types.Project, opti
|
|||||||
if service.Build == nil {
|
if service.Build == nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
imageName := getImageName(service, project.Name)
|
imageName := api.GetImageNameOrDefault(service, project.Name)
|
||||||
imagesToBuild = append(imagesToBuild, imageName)
|
imagesToBuild = append(imagesToBuild, imageName)
|
||||||
buildOptions, err := s.toBuildOptions(project, service, imageName, options.SSHs)
|
buildOptions, err := s.toBuildOptions(project, service, imageName, options.SSHs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -135,7 +135,7 @@ func (s *composeService) ensureImagesExists(ctx context.Context, project *types.
|
|||||||
}
|
}
|
||||||
// set digest as com.docker.compose.image label so we can detect outdated containers
|
// set digest as com.docker.compose.image label so we can detect outdated containers
|
||||||
for i, service := range project.Services {
|
for i, service := range project.Services {
|
||||||
image := getImageName(service, project.Name)
|
image := api.GetImageNameOrDefault(service, project.Name)
|
||||||
digest, ok := images[image]
|
digest, ok := images[image]
|
||||||
if ok {
|
if ok {
|
||||||
if project.Services[i].Labels == nil {
|
if project.Services[i].Labels == nil {
|
||||||
@ -154,7 +154,7 @@ func (s *composeService) getBuildOptions(project *types.Project, images map[stri
|
|||||||
if service.Image == "" && service.Build == nil {
|
if service.Image == "" && service.Build == nil {
|
||||||
return nil, fmt.Errorf("invalid service %q. Must specify either image or build", service.Name)
|
return nil, fmt.Errorf("invalid service %q. Must specify either image or build", service.Name)
|
||||||
}
|
}
|
||||||
imageName := getImageName(service, project.Name)
|
imageName := api.GetImageNameOrDefault(service, project.Name)
|
||||||
_, localImagePresent := images[imageName]
|
_, localImagePresent := images[imageName]
|
||||||
|
|
||||||
if service.Build != nil {
|
if service.Build != nil {
|
||||||
@ -176,7 +176,7 @@ func (s *composeService) getBuildOptions(project *types.Project, images map[stri
|
|||||||
func (s *composeService) getLocalImagesDigests(ctx context.Context, project *types.Project) (map[string]string, error) {
|
func (s *composeService) getLocalImagesDigests(ctx context.Context, project *types.Project) (map[string]string, error) {
|
||||||
var imageNames []string
|
var imageNames []string
|
||||||
for _, s := range project.Services {
|
for _, s := range project.Services {
|
||||||
imgName := getImageName(s, project.Name)
|
imgName := api.GetImageNameOrDefault(s, project.Name)
|
||||||
if !utils.StringContains(imageNames, imgName) {
|
if !utils.StringContains(imageNames, imgName) {
|
||||||
imageNames = append(imageNames, imgName)
|
imageNames = append(imageNames, imgName)
|
||||||
}
|
}
|
||||||
@ -191,7 +191,7 @@ func (s *composeService) getLocalImagesDigests(ctx context.Context, project *typ
|
|||||||
}
|
}
|
||||||
|
|
||||||
for i := range project.Services {
|
for i := range project.Services {
|
||||||
imgName := getImageName(project.Services[i], project.Name)
|
imgName := api.GetImageNameOrDefault(project.Services[i], project.Name)
|
||||||
digest, ok := images[imgName]
|
digest, ok := images[imgName]
|
||||||
if ok {
|
if ok {
|
||||||
project.Services[i].CustomLabels.Add(api.ImageDigestLabel, digest)
|
project.Services[i].CustomLabels.Add(api.ImageDigestLabel, digest)
|
||||||
|
@ -29,6 +29,7 @@ import (
|
|||||||
"github.com/compose-spec/compose-go/types"
|
"github.com/compose-spec/compose-go/types"
|
||||||
buildx "github.com/docker/buildx/build"
|
buildx "github.com/docker/buildx/build"
|
||||||
"github.com/docker/cli/cli/command/image/build"
|
"github.com/docker/cli/cli/command/image/build"
|
||||||
|
"github.com/docker/compose/v2/pkg/api"
|
||||||
dockertypes "github.com/docker/docker/api/types"
|
dockertypes "github.com/docker/docker/api/types"
|
||||||
"github.com/docker/docker/cli"
|
"github.com/docker/docker/cli"
|
||||||
"github.com/docker/docker/pkg/archive"
|
"github.com/docker/docker/pkg/archive"
|
||||||
@ -45,7 +46,7 @@ func (s *composeService) doBuildClassic(ctx context.Context, project *types.Proj
|
|||||||
var nameDigests = make(map[string]string)
|
var nameDigests = make(map[string]string)
|
||||||
var errs error
|
var errs error
|
||||||
err := project.WithServices(nil, func(service types.ServiceConfig) error {
|
err := project.WithServices(nil, func(service types.ServiceConfig) error {
|
||||||
imageName := getImageName(service, project.Name)
|
imageName := api.GetImageNameOrDefault(service, project.Name)
|
||||||
o, ok := opts[imageName]
|
o, ok := opts[imageName]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil
|
return nil
|
||||||
|
@ -227,14 +227,6 @@ func (s *composeService) ensureProjectVolumes(ctx context.Context, project *type
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getImageName(service types.ServiceConfig, projectName string) string {
|
|
||||||
imageName := service.Image
|
|
||||||
if imageName == "" {
|
|
||||||
imageName = projectName + "_" + service.Name
|
|
||||||
}
|
|
||||||
return imageName
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project, service types.ServiceConfig,
|
func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project, service types.ServiceConfig,
|
||||||
number int, inherit *moby.Container, autoRemove bool, attachStdin bool) (*container.Config, *container.HostConfig, *network.NetworkingConfig, error) {
|
number int, inherit *moby.Container, autoRemove bool, attachStdin bool) (*container.Config, *container.HostConfig, *network.NetworkingConfig, error) {
|
||||||
|
|
||||||
@ -279,7 +271,7 @@ func (s *composeService) getCreateOptions(ctx context.Context, p *types.Project,
|
|||||||
AttachStderr: true,
|
AttachStderr: true,
|
||||||
AttachStdout: true,
|
AttachStdout: true,
|
||||||
Cmd: runCmd,
|
Cmd: runCmd,
|
||||||
Image: getImageName(service, p.Name),
|
Image: api.GetImageNameOrDefault(service, p.Name),
|
||||||
WorkingDir: service.WorkingDir,
|
WorkingDir: service.WorkingDir,
|
||||||
Entrypoint: entrypoint,
|
Entrypoint: entrypoint,
|
||||||
NetworkDisabled: service.NetworkMode == "disabled",
|
NetworkDisabled: service.NetworkMode == "disabled",
|
||||||
@ -712,7 +704,7 @@ func (s *composeService) buildContainerVolumes(ctx context.Context, p types.Proj
|
|||||||
inherit *moby.Container) (map[string]struct{}, []string, []mount.Mount, error) {
|
inherit *moby.Container) (map[string]struct{}, []string, []mount.Mount, error) {
|
||||||
var mounts = []mount.Mount{}
|
var mounts = []mount.Mount{}
|
||||||
|
|
||||||
image := getImageName(service, p.Name)
|
image := api.GetImageNameOrDefault(service, p.Name)
|
||||||
imgInspect, _, err := s.apiClient().ImageInspectWithRaw(ctx, image)
|
imgInspect, _, err := s.apiClient().ImageInspectWithRaw(ctx, image)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
|
@ -22,10 +22,12 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
composetypes "github.com/compose-spec/compose-go/types"
|
|
||||||
"github.com/docker/compose/v2/pkg/api"
|
"github.com/docker/compose/v2/pkg/api"
|
||||||
|
|
||||||
|
composetypes "github.com/compose-spec/compose-go/types"
|
||||||
moby "github.com/docker/docker/api/types"
|
moby "github.com/docker/docker/api/types"
|
||||||
mountTypes "github.com/docker/docker/api/types/mount"
|
mountTypes "github.com/docker/docker/api/types/mount"
|
||||||
|
|
||||||
"gotest.tools/v3/assert"
|
"gotest.tools/v3/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -65,8 +67,8 @@ func TestBuildVolumeMount(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestServiceImageName(t *testing.T) {
|
func TestServiceImageName(t *testing.T) {
|
||||||
assert.Equal(t, getImageName(composetypes.ServiceConfig{Image: "myImage"}, "myProject"), "myImage")
|
assert.Equal(t, api.GetImageNameOrDefault(composetypes.ServiceConfig{Image: "myImage"}, "myProject"), "myImage")
|
||||||
assert.Equal(t, getImageName(composetypes.ServiceConfig{Name: "aService"}, "myProject"), "myProject_aService")
|
assert.Equal(t, api.GetImageNameOrDefault(composetypes.ServiceConfig{Name: "aService"}, "myProject"), "myProject_aService")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPrepareNetworkLabels(t *testing.T) {
|
func TestPrepareNetworkLabels(t *testing.T) {
|
||||||
|
@ -195,7 +195,7 @@ func (s *composeService) getServiceImages(options api.DownOptions, project *type
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if image == "" {
|
if image == "" {
|
||||||
image = getImageName(service, project.Name)
|
image = api.GetImageNameOrDefault(service, project.Name)
|
||||||
}
|
}
|
||||||
images[image] = struct{}{}
|
images[image] = struct{}{}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user