# Create a builder container # golang:1.18.0-buster amd64 FROM golang@sha256:7d39537344486528f8cdb3bd8adb98ab7f0f4236044b6944fed8631da35a4ce5 AS build WORKDIR /go/src/app # Create appuser to isolate potential vulnerabilities # See https://stackoverflow.com/a/55757473/12429735 ENV USER=appuser ENV UID=10001 RUN adduser \ --disabled-password \ --gecos "" \ --home "/nonexistent" \ --shell "/sbin/nologin" \ --no-create-home \ --uid "${UID}" \ "${USER}" # Create a new tmp directory so no bad actors can manipulate it RUN mkdir /temporary-tmp-directory && chmod 777 /temporary-tmp-directory ############################################################################### # Final stage FROM scratch # Run all commands as non-root USER appuser:appuser # Allow container to use latest TLS certificates COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ # Copy over appuser to run as non-root COPY --from=build /etc/passwd /etc/passwd COPY --from=build /etc/group /etc/group # Copy over the /tmp directory for golang/os.TmpDir COPY --chown=appuser --from=build /temporary-tmp-directory /tmp # Expose application port EXPOSE 8989 # Copy application from external build COPY vcsim /vcsim # Set entrypoint to application with container defaults ENTRYPOINT [ "/vcsim" ] CMD ["-l", "0.0.0.0:8989"]