--- /dev/null
+# STEP 1 build executable binary
+FROM golang:alpine as builder
+# Install SSL ca certificates
+RUN apk update && apk add git && apk add ca-certificates
+# Create appuser
+RUN adduser -D -g '' appuser
+COPY . $GOPATH/src/mypackage/myapp/
+WORKDIR $GOPATH/src/mypackage/myapp/
+COPY ./go.mod ./
+#COPY ./go.sum ./
+RUN go get github.com/rabbitmq/amqp091-go
+RUN go mod download
+WORKDIR $GOPATH/src/mypackage/myapp/wunder
+
+#get dependancies
+#RUN go get -d -v
+#build the binary
+RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags="-w -s" -o /go/bin/wunder
+
+FROM alpine:edge
+COPY --from=builder /go/bin/wunder /bin/wunder
+ENTRYPOINT ["/bin/wunder"]
--- /dev/null
+package main
+
+import (
+ "context"
+ "crypto/tls"
+ "crypto/x509"
+ "encoding/json"
+ "fmt"
+ "io/ioutil"
+ "log"
+ "os"
+ "time"
+
+ amqp "github.com/rabbitmq/amqp091-go"
+)
+
+func failOnError(err error, msg string) {
+ if err != nil {
+ log.Panicf("%s: %s", msg, err)
+ }
+}
+
+func main() {
+ configJson, err := ioutil.ReadFile(os.Args[1])
+ if err != nil {
+ failOnError(err, "oh no read")
+ }
+ var result map[string]interface{}
+ json.Unmarshal([]byte(configJson), &result)
+ fmt.Println(result)
+
+ // no cert verification because we're self-signed
+ cfg := new(tls.Config)
+ cfg.RootCAs = x509.NewCertPool()
+ cfg.InsecureSkipVerify = true
+
+ conn, err := amqp.DialTLS(fmt.Sprintf("amqps://%s:%s@%s:5671/%s", result["user"], result["password"], result["host"], result["vhost"]), cfg)
+ failOnError(err, "Failed to connect to RabbitMQ")
+ defer conn.Close()
+
+ ch, err := conn.Channel()
+ failOnError(err, "Failed to open a channel")
+ defer ch.Close()
+
+ err = ch.ExchangeDeclare(
+ result["exchange"].(string), // name
+ amqp.ExchangeTopic, // type
+ true, // durable
+ false, // autodelete
+ false, // internal (doesn't accept publish so...)
+ false, // block and wait for call to finish
+ nil, // optional args I don't know any
+ )
+ failOnError(err, "Failed exchange stuff")
+
+ err = ch.Confirm(false) // wait for this to finish too, confirm delivery of messages
+ failOnError(err, "Failed confirm")
+
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+ send_obj := make(map[string]interface{})
+ send_obj["text"] = "Hello World!"
+
+ data, err := json.Marshal(send_obj)
+ failOnError(err, "oh no json marshal")
+
+ err = ch.PublishWithContext(ctx,
+ result["exchange"].(string), // exchange
+ "lol", // routing key
+ false, // mandatory
+ false, // immediate
+ amqp.Publishing{
+ ContentType: "application/json",
+ Body: data,
+ })
+ failOnError(err, "Failed to publish a message")
+ log.Printf(" [x] Sent %s\n", data)
+}