@@ -138,25 +138,36 @@ func (m Module) Deploy(modulesSettings interface{}) error {
138138 return err
139139 }
140140
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" ,
148145 }
149146
147+ oldComposeFilePath := ""
150148 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 )
158151 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 ())
160171 }
161172 }
162173
@@ -177,17 +188,13 @@ func (m Module) Deploy(modulesSettings interface{}) error {
177188 if err != nil {
178189 return err
179190 }
191+ dockerComposeResource .Content = composeFileContent
180192
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 },
191198 })
192199
193200 var containerResources []system.Resource
@@ -202,14 +209,24 @@ func (m Module) Deploy(modulesSettings interface{}) error {
202209 })
203210 }
204211
205- system .Context .Resources = append (system .Context .Resources , system.ResourceGroup {
212+ system .Context .CurrentDeployment . ResourceGroups = append (system .Context .CurrentDeployment . ResourceGroups , system.ResourceGroup {
206213 Name : "container-docker-" + system .Context .Project .Name + "-containers" ,
207214 Resources : containerResources ,
208215 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+
209227 // Start Docker Compose
210228 // 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 {
213230 if stderr .Len () > 0 {
214231 return fmt .Errorf ("Unable to start Docker containers: " + stderr .String ())
215232 }
@@ -223,14 +240,24 @@ func (m Module) Deploy(modulesSettings interface{}) error {
223240 return nil
224241 },
225242 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+
226254 // Stop Docker Compose
227255 // 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 {
230257 if stderr .Len () > 0 {
231258 return fmt .Errorf ("Unable to stop Docker containers: " + stderr .String ())
232259 }
233- return fmt .Errorf ("Unable to stop Docker containers: " + err .Error ())
260+ return fmt .Errorf ("Unable to stop new Docker containers: " + err .Error ())
234261 }
235262 return nil
236263 },
0 commit comments