Skip to content

Commit 6be316a

Browse files
committed
feat(deployment): prefix container names with project name
BREAKING CHANGE: Container naming convention now includes project prefix
1 parent 4ad0143 commit 6be316a

File tree

3 files changed

+32
-24
lines changed

3 files changed

+32
-24
lines changed

pkg/deployment/container.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,19 +127,19 @@ func (d *Deployment) performHealthChecks(container string, healthCheck *config.H
127127
return fmt.Errorf("container failed to become healthy\n\x1b[93mOutput from the container:\x1b[0m\n%s", grayOutput)
128128
}
129129

130-
func (d *Deployment) startContainer(service *config.Service) error {
131-
_, err := d.runCommand(context.Background(), "docker", "start", service.Name)
130+
func (d *Deployment) startContainer(container string) error {
131+
_, err := d.runCommand(context.Background(), "docker", "start", container)
132132
if err != nil {
133-
return fmt.Errorf("failed to start container for %s: %v", service.Name, err)
133+
return fmt.Errorf("failed to start container for %s: %v", container, err)
134134
}
135135

136136
return nil
137137
}
138138

139139
func (d *Deployment) createContainer(project string, service *config.Service, suffix string) error {
140-
svcName := service.Name
140+
container := containerName(project, service.Name, suffix)
141141

142-
args := []string{"run", "-d", "--name", svcName + suffix, "--network", project, "--network-alias", svcName + suffix, "--restart", "unless-stopped"}
142+
args := []string{"run", "-d", "--name", container, "--network", project, "--network-alias", service.Name + suffix, "--restart", "unless-stopped"}
143143

144144
for _, value := range service.Env {
145145
args = append(args, "-e", value)
@@ -219,3 +219,7 @@ func (d *Deployment) containerShouldBeUpdated(project string, service *config.Se
219219

220220
return containerInfo.Config.Labels["ftl.config-hash"] != hash, nil
221221
}
222+
223+
func containerName(project, service, suffix string) string {
224+
return fmt.Sprintf("%s-%s%s", project, service, suffix)
225+
}

pkg/deployment/deployment_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,11 @@ func (suite *DeploymentTestSuite) TestDeploy() {
215215
fmt.Printf("Total requests: %d\n", requestStats.totalRequests)
216216
fmt.Printf("Failed requests: %d\n", requestStats.failedRequests)
217217

218-
serviceName := "web"
219218
suite.Require().Equal(int32(0), requestStats.failedRequests, "Expected zero failed requests during zero-downtime deployment")
220219

221-
containerInfo := suite.inspectContainer(serviceName)
220+
serviceName := "web"
221+
containerName := containerName(project, serviceName, "")
222+
containerInfo := suite.inspectContainer(containerName)
222223

223224
suite.Run("Updated Container State and Config", func() {
224225
state := containerInfo["State"].(map[string]interface{})

pkg/deployment/service.go

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ func (d *Deployment) deployService(project string, service *config.Service) erro
7777
}
7878

7979
if containerStatus == ContainerStatusStopped {
80-
if err := d.startContainer(service); err != nil {
80+
container := containerName(project, service.Name, "")
81+
if err := d.startContainer(container); err != nil {
8182
return fmt.Errorf("failed to start container %s: %w", service.Name, err)
8283
}
8384
return nil
@@ -91,17 +92,17 @@ func (d *Deployment) installService(project string, service *config.Service) err
9192
return fmt.Errorf("failed to start container for %s: %v", service.Image, err)
9293
}
9394

94-
svcName := service.Name
95+
container := containerName(project, service.Name, "")
9596

96-
if err := d.performHealthChecks(svcName, service.HealthCheck); err != nil {
97-
return fmt.Errorf("install failed for %s: container is unhealthy: %w", svcName, err)
97+
if err := d.performHealthChecks(container, service.HealthCheck); err != nil {
98+
return fmt.Errorf("install failed for %s: container is unhealthy: %w", container, err)
9899
}
99100

100101
return nil
101102
}
102103

103104
func (d *Deployment) updateService(project string, service *config.Service) error {
104-
svcName := service.Name
105+
container := containerName(project, service.Name, "")
105106

106107
if service.Recreate {
107108
if err := d.recreateService(project, service); err != nil {
@@ -111,23 +112,23 @@ func (d *Deployment) updateService(project string, service *config.Service) erro
111112
}
112113

113114
if err := d.createContainer(project, service, newContainerSuffix); err != nil {
114-
return fmt.Errorf("failed to start new container for %s: %v", svcName, err)
115+
return fmt.Errorf("failed to start new container for %s: %v", container, err)
115116
}
116117

117-
if err := d.performHealthChecks(svcName+newContainerSuffix, service.HealthCheck); err != nil {
118-
if _, err := d.runCommand(context.Background(), "docker", "rm", "-f", svcName+newContainerSuffix); err != nil {
119-
return fmt.Errorf("update failed for %s: new container is unhealthy and cleanup failed: %v", svcName, err)
118+
if err := d.performHealthChecks(container+newContainerSuffix, service.HealthCheck); err != nil {
119+
if _, err := d.runCommand(context.Background(), "docker", "rm", "-f", container+newContainerSuffix); err != nil {
120+
return fmt.Errorf("update failed for %s: new container is unhealthy and cleanup failed: %v", container, err)
120121
}
121-
return fmt.Errorf("update failed for %s: new container is unhealthy: %w", svcName, err)
122+
return fmt.Errorf("update failed for %s: new container is unhealthy: %w", container, err)
122123
}
123124

124-
oldContID, err := d.switchTraffic(project, svcName)
125+
oldContID, err := d.switchTraffic(project, service.Name)
125126
if err != nil {
126-
return fmt.Errorf("failed to switch traffic for %s: %v", svcName, err)
127+
return fmt.Errorf("failed to switch traffic for %s: %v", container, err)
127128
}
128129

129-
if err := d.cleanup(oldContID, svcName); err != nil {
130-
return fmt.Errorf("failed to cleanup for %s: %v", svcName, err)
130+
if err := d.cleanup(project, oldContID, service.Name); err != nil {
131+
return fmt.Errorf("failed to cleanup for %s: %v", container, err)
131132
}
132133

133134
return nil
@@ -162,7 +163,7 @@ func (d *Deployment) recreateService(project string, service *config.Service) er
162163
}
163164

164165
func (d *Deployment) switchTraffic(project, service string) (string, error) {
165-
newContainer := service + newContainerSuffix
166+
newContainer := containerName(project, service, newContainerSuffix)
166167
oldContainer, err := d.getContainerID(project, service)
167168
if err != nil {
168169
return "", fmt.Errorf("failed to get old container ID: %v", err)
@@ -194,11 +195,13 @@ func (d *Deployment) switchTraffic(project, service string) (string, error) {
194195
return oldContainer, nil
195196
}
196197

197-
func (d *Deployment) cleanup(oldContID, service string) error {
198+
func (d *Deployment) cleanup(project, oldContID, service string) error {
199+
oldContainer := containerName(project, service, newContainerSuffix)
200+
newContainer := containerName(project, service, "")
198201
cmds := [][]string{
199202
{"docker", "stop", oldContID},
200203
{"docker", "rm", oldContID},
201-
{"docker", "rename", service + newContainerSuffix, service},
204+
{"docker", "rename", oldContainer, newContainer},
202205
}
203206

204207
for _, cmd := range cmds {

0 commit comments

Comments
 (0)