Building a docker image for Temporalite

I’m trying to build Temporalite into a Docker Image. My first attempt for a Docker file looked like so:

FROM public.ecr.aws/docker/library/golang:1.18 AS builder

RUN go install github.com/temporalio/temporalite/cmd/temporalite@latest

FROM public.ecr.aws/docker/library/alpine:3.16

RUN apk update && \
    apk upgrade && \
    apk add bash

COPY --from=builder ${GOPATH:-/go}/bin/temporalite /
EXPOSE 7233 8233

ENTRYPOINT ["/temporalite", "start", "--ephemeral", "-n", "default", "--ip" , "0.0.0.0"]

But the go install command fails with:

------
 > [builder 2/2] RUN go install github.com/temporalio/temporalite/cmd/temporalite@latest:
#8 0.273 go: downloading github.com/temporalio/temporalite v0.2.0
#8 0.291 go: github.com/temporalio/temporalite/cmd/temporalite@latest (in github.com/temporalio/temporalite@v0.2.0):
#8 0.291 	The go.mod file for the module providing named packages contains one or
#8 0.291 	more replace directives. It must not contain directives that would cause
#8 0.291 	it to be interpreted differently than if it were the main module.
------

So brute forcing it, I changed to this…

FROM public.ecr.aws/docker/library/golang:1.18 AS builder

WORKDIR ${GOPATH:-/go}/src/temporalite

RUN mkdir -p ${GOPATH:-/go}/src/temporalite && \
    git clone https://github.com/temporalio/temporalite.git ${GOPATH:-/go}/src/temporalite && \
    cd ${GOPATH:-/go}/src/temporalite && \
    git checkout v0.2.0 && \
    go mod download && \
    go get -d -v ./... && \
    go build -o ${GOPATH:-/go}/bin/ ${GOPATH:-/go}/src/temporalite/cmd/temporalite

FROM public.ecr.aws/docker/library/alpine:3.16

RUN apk update && \
    apk upgrade && \
    apk add bash

COPY --from=builder ${GOPATH:-/go}/bin/temporalite /bin
EXPOSE 7233 8233

ENTRYPOINT ["/bin/temporalite", "start", "--ephemeral", "-n", "default", "--ip" , "0.0.0.0"]

Which does build fine. But when I do:

docker run temporal-test:latest

I get:

exec /bin/temporalite: no such file or directory

But when I load up a bash shell:

docker run -it --entrypoint "/bin/bash" temporal-test:latest
bash-5.1# pwd
/
bash-5.1# ls /bin/temporalite
/bin/temporalite
bash-5.1# pwd
/
bash-5.1# ls -l /bin/temporalite
-rwxr-xr-x    1 root     root      99799868 Oct  4 19:13 /bin/temporalite
bash-5.1# stat /bin/temporalite
  File: /bin/temporalite
  Size: 99799868  	Blocks: 194928     IO Block: 4096   regular file
Device: 96h/150d	Inode: 11937350    Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-10-04 19:13:38.313498001 +0000
Modify: 2022-10-04 19:13:37.618498001 +0000
Change: 2022-10-04 19:13:38.250498001 +0000
bash-5.1# file /bin/temporalite
/bin/temporalite: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, Go BuildID=7NlJoBFjKDFLgqGcI8_U/NzYsDgYA9a9P2aIwVSCA/7vwHNlTp-roUhrIaQInb/mg2aFR1lwF-vtmn-kK2h, not stripped
bash-5.1# arch
aarch64

The file exists, but it won’t execute. And architectures are the same.

This one has me stumped.

Solved by switching to from Alpine to Debian. Guess I should stop using Alpine by default.

FROM public.ecr.aws/docker/library/golang:1.18 AS builder

RUN mkdir -p ${GOPATH:-/go}/src/temporalite && \
    git clone https://github.com/temporalio/temporalite.git ${GOPATH:-/go}/src/temporalite && \
    cd ${GOPATH:-/go}/src/temporalite && \
    git switch -c tmp v0.2.0 && \
    go mod download && \
    go get -d -v ./... && \
    go build -o ${GOPATH:-/go}/bin/ ${GOPATH:-/go}/src/temporalite/cmd/temporalite

FROM public.ecr.aws/debian/debian:stable-slim

COPY --from=builder ${GOPATH:-/go}/bin/temporalite /bin
EXPOSE 7233 8233

ENTRYPOINT ["/bin/temporalite", "start", "--ephemeral", "-n", "default", "--ip" , "0.0.0.0"]

Just to add here is a docker compose if helpful: GitHub - tsurdilo/my-temporal-dockercompose: my custom docker compose for temporal

FYI, in the meantime, I use this for temporal in docker for local dev, it is fast to build (just download latest temporal CLI, no need to build go modules), and starts temporalite via the new temporal CLI

FROM curlimages/curl as builder

WORKDIR /
RUN curl -sSf https://temporal.download/cli.sh | sh

FROM gcr.io/distroless/base-debian11

COPY --from=builder /home/curl_user/.temporalio/bin/temporal /bin/temporal
EXPOSE 7233
EXPOSE 8233

ENTRYPOINT ["temporal", "server", "start-dev", "--ip" , "0.0.0.0"]
1 Like