Docker throwing "{binary} not found" error

Viewed 123

I have a very simple Go app that I'm trying to Dockerize.

package main

import (
    "fmt"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/", date)
    http.HandleFunc("/health", healthCheck)
    http.ListenAndServe(":8080", nil)
}

func healthCheck(w http.ResponseWriter, r *http.Request){
    fmt.Fprintf(w, "I'm alive!")
}

func date(w http.ResponseWriter, r *http.Request) {
    now := time.Now()
    fmt.Fprintf(w, now.Format("2006-01-02 15:04:05"))
}

My Dockerfile:

FROM golang:1.14.6

RUN mkdir /app
COPY date.go /app
WORKDIR /app

RUN go build date.go

RUN groupadd -g 999 appuser && \
    useradd -r -u 999 -g appuser appuser
USER appuser

EXPOSE 8080
CMD ['/app/date']

However, when I use docker run to run the app, I get the following error:

/bin/sh: 1: [/app/date]: not found

I've commented out the CMD ['/app/date'] line and rebuilt the image, and then was able to exec into it by running

docker run -dit goapp
docker exec -ti [containerid] /bin/bash

This takes me into the /app folder where I do see the date file. And I am able to run /app/date without any issues. I'm not sure what I'm doing wrong.

1 Answers

The CMD is interpreted as JSON, so you need to change the single quotes to double quotes.

CMD ["/app/date"]

This is specified in the Dockerfile documentation:

The exec form is parsed as a JSON array, which means that you must use double-quotes (") around words not single-quotes (').

Related