The Destroyer interface is responsible for removing any resources which have been created by the waypoint deploy and release phase.


Destroy can only be implemented in Platform and ReleaseManager components and is implemented through the following interface.

type Destroyer interface {
  // DestroyFunc should return the method handle for the destroy operation.
  DestroyFunc() interface{}

DestroyFunc requires you return a function, like other interface functions Waypoint will automatically inject any of the standard parameters. In addition you can specify the output value returned from the DeployFunc, or from ReleaseFunc, the details of which you can use to clean up any deployments. As shown in the example below, the function signature for a DestroyFunc function only has a single output parameter which is an error used to signal if the destroy operation succeeded.

func (d *Deploy) DestroyFunc() interface{} {
  return d.destroy

func (d *Deploy) destroy(
  ctx context.Context,
  ui terminal.UI,
  deployment *Deployment,
) error {
  st := ui.Status()
  defer st.Close()

  err := os.RemoveAll(d.config.Directory)
  if err != nil {
    st.Step(terminal.ErrorStyle, fmt.Sprintf("Unable to remove deployments %s", d.config.Directory))
    return err

  st.Step(terminal.StatusOK, fmt.Sprintf("Removed deployments %s", d.config.Directory))
  return nil