@@ -138,25 +138,36 @@ func (m Module) Deploy(modulesSettings interface{}) error {
138
138
return err
139
139
}
140
140
141
- composeFileRemotePath := system .Context .Project .GetDirectoryPath () + "/docker-compose.yaml"
142
-
143
- hasRemoteFile , err := xfs .HasFile ("ssh://" + composeFileRemotePath )
144
- if err != nil && err .Error () == "file does not exist" {
145
- hasRemoteFile = false
146
- } else if err != nil {
147
- return fmt .Errorf ("Unable to check state of remote docker-compose.yaml from previous deployment: " + err .Error ())
141
+ dockerComposeResource := system.Resource {
142
+ Type : system .TypeFile ,
143
+ Operation : system .OperationCreate ,
144
+ Name : "docker-compose.yaml" ,
148
145
}
149
146
147
+ oldComposeFilePath := ""
150
148
var remoteComposeObjMap map [string ]interface {}
151
- if hasRemoteFile {
152
- remoteComposeObj := docker_compose.DockerCompose {}
153
- remoteComposeContent , err := xfs .ReadFile ("ssh://" + composeFileRemotePath )
154
- if err := yaml .Unmarshal ([]byte (remoteComposeContent ), & remoteComposeObj ); err != nil {
155
- return fmt .Errorf ("unable to read remote docker-compose.yaml file from previous deployment: " + err .Error ())
156
- }
157
- remoteComposeObjMap , err = remoteComposeObj .Map ()
149
+ if system .Context .LatestDeployment != nil {
150
+ dockerComposeFilePathOld , err := system .Context .LatestDeployment .GetResourcePath (dockerComposeResource )
158
151
if err != nil {
159
- return fmt .Errorf ("unable to process remote docker-compose.yaml file from previous deployment: " + err .Error ())
152
+ return err
153
+ }
154
+ oldComposeFilePath = dockerComposeFilePathOld
155
+ hasRemoteFile , err := xfs .HasFile ("ssh://" + oldComposeFilePath )
156
+ if err != nil && hasRemoteFile {
157
+ remoteComposeContent , err := xfs .ReadFile ("ssh://" + oldComposeFilePath )
158
+ if err != nil {
159
+ return fmt .Errorf ("unable to read remote docker-compose.yaml file from previous deployment: " + err .Error ())
160
+ }
161
+ remoteComposeObj := docker_compose.DockerCompose {}
162
+ if err := yaml .Unmarshal ([]byte (remoteComposeContent ), & remoteComposeObj ); err != nil {
163
+ return fmt .Errorf ("unable to read remote docker-compose.yaml file from previous deployment: " + err .Error ())
164
+ }
165
+ remoteComposeObjMap , err = remoteComposeObj .Map ()
166
+ if err != nil {
167
+ return fmt .Errorf ("unable to process remote docker-compose.yaml file from previous deployment: " + err .Error ())
168
+ }
169
+ } else if err != nil && err .Error () != "file does not exist" {
170
+ return fmt .Errorf ("Unable to check state of remote docker-compose.yaml from previous deployment: " + err .Error ())
160
171
}
161
172
}
162
173
@@ -177,17 +188,13 @@ func (m Module) Deploy(modulesSettings interface{}) error {
177
188
if err != nil {
178
189
return err
179
190
}
191
+ dockerComposeResource .Content = composeFileContent
180
192
181
- system .Context .Resources = append (system .Context .Resources , system.ResourceGroup {
182
- Name : "container-docker-" + system .Context .Project .Name + "-composefile" ,
183
- Resources : []system.Resource {
184
- {
185
- Type : system .TypeFile ,
186
- Operation : system .OperationCreate ,
187
- Name : composeFileRemotePath ,
188
- Content : composeFileContent ,
189
- },
190
- },
193
+ dockerComposeFilePathNew , _ := system .Context .CurrentDeployment .GetResourcePath (dockerComposeResource )
194
+
195
+ system .Context .CurrentDeployment .ResourceGroups = append (system .Context .CurrentDeployment .ResourceGroups , system.ResourceGroup {
196
+ Name : "container-docker-" + system .Context .Project .Name + "-composefile" ,
197
+ Resources : []system.Resource {dockerComposeResource },
191
198
})
192
199
193
200
var containerResources []system.Resource
@@ -202,14 +209,24 @@ func (m Module) Deploy(modulesSettings interface{}) error {
202
209
})
203
210
}
204
211
205
- system .Context .Resources = append (system .Context .Resources , system.ResourceGroup {
212
+ system .Context .CurrentDeployment . ResourceGroups = append (system .Context .CurrentDeployment . ResourceGroups , system.ResourceGroup {
206
213
Name : "container-docker-" + system .Context .Project .Name + "-containers" ,
207
214
Resources : containerResources ,
208
215
ApplyResourceFunc : func () error {
216
+ if oldComposeFilePath != "" {
217
+ // Stop old Docker Compose containers
218
+ // todo: allow using either docker-compose or "docker compose" whichever is available (prefer "docker compose")
219
+ if _ , stderr , err := system .RemoteRun ("docker compose" , system.RemoteRunOpts {Args : []string {"down" }, WorkingDir : path .Dir (oldComposeFilePath )}); err != nil {
220
+ if stderr .Len () > 0 {
221
+ return fmt .Errorf ("Unable to stop old Docker containers: " + stderr .String ())
222
+ }
223
+ return fmt .Errorf ("Unable to stop old Docker containers: " + err .Error ())
224
+ }
225
+ }
226
+
209
227
// Start Docker Compose
210
228
// todo: allow using either docker-compose or "docker compose" whichever is available (prefer "docker compose")
211
- _ , stderr , err := system .RemoteRun ("docker compose" , system.RemoteRunOpts {Args : []string {"up" , "-d" }, WorkingDir : system .Context .Project .GetDirectoryPath ()})
212
- if err != nil {
229
+ if _ , stderr , err := system .RemoteRun ("docker compose" , system.RemoteRunOpts {Args : []string {"up" , "-d" }, WorkingDir : path .Dir (dockerComposeFilePathNew )}); err != nil {
213
230
if stderr .Len () > 0 {
214
231
return fmt .Errorf ("Unable to start Docker containers: " + stderr .String ())
215
232
}
@@ -223,14 +240,24 @@ func (m Module) Deploy(modulesSettings interface{}) error {
223
240
return nil
224
241
},
225
242
RollbackResourceFunc : func () error {
243
+ // Start old containers again
244
+ if oldComposeFilePath != "" {
245
+ // todo: allow using either docker-compose or "docker compose" whichever is available (prefer "docker compose")
246
+ if _ , stderr , err := system .RemoteRun ("docker compose" , system.RemoteRunOpts {Args : []string {"up" , "-d" }, WorkingDir : path .Dir (oldComposeFilePath )}); err != nil {
247
+ if stderr .Len () > 0 {
248
+ return fmt .Errorf ("Unable to stop Docker containers: " + stderr .String ())
249
+ }
250
+ return fmt .Errorf ("Unable to start old Docker containers: " + err .Error ())
251
+ }
252
+ }
253
+
226
254
// Stop Docker Compose
227
255
// todo: allow using either docker-compose or "docker compose" whichever is available (prefer "docker compose")
228
- _ , stderr , err := system .RemoteRun ("docker compose" , system.RemoteRunOpts {Args : []string {"down" }, WorkingDir : system .Context .Project .GetDirectoryPath ()})
229
- if err != nil {
256
+ if _ , stderr , err := system .RemoteRun ("docker compose" , system.RemoteRunOpts {Args : []string {"down" }, WorkingDir : path .Dir (dockerComposeFilePathNew )}); err != nil {
230
257
if stderr .Len () > 0 {
231
258
return fmt .Errorf ("Unable to stop Docker containers: " + stderr .String ())
232
259
}
233
- return fmt .Errorf ("Unable to stop Docker containers: " + err .Error ())
260
+ return fmt .Errorf ("Unable to stop new Docker containers: " + err .Error ())
234
261
}
235
262
return nil
236
263
},
0 commit comments