-
Notifications
You must be signed in to change notification settings - Fork 1
/
arch.Dockerfile
125 lines (99 loc) · 3.89 KB
/
arch.Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
ARG OS=linux
ARG ARCH=amd64
ARG BUILDPLATFORM=${OS}/${ARCH}
ARG DISTRO_VERSION="2023091804"
ARG BASE_IMAGE="binhex/arch-base:${DISTRO_VERSION}"
# ################################################################################
FROM --platform=${BUILDPLATFORM} ${BASE_IMAGE} as base
ARG OS
ARG ARCH
ARG GO_VERSION="1.20.8"
# # NOTE: add libusb-dev to run with LEDGER_ENABLED=true
RUN set -eu & \
pacman -Syyu --noconfirm linux-headers base-devel glibc git bc && \
curl -sSL https://go.dev/dl/go${GO_VERSION}.${OS}-${ARCH}.tar.gz | \
tar -C / -xz && \
ln -s /go/bin/go /usr/local/bin/go
COPY ./bin/install-mimalloc ./bin/install-wasmvm ./bin/install-rocksdb /usr/local/bin/
# ################################################################################
FROM base as builder
ARG APP_NAME="terra"
ARG BIN_NAME="${APP_NAME}d"
ARG GIT_TAG="v2.4.1"
ARG GIT_REPO="terra-money/core"
ARG MIMALLOC_VERSION
# ARG MIMALLOC_VERSION="v2.1.2"
ENV GOPATH=/go
ENV MIMALLOC_VERSION=${MIMALLOC_VERSION}
# install mimalloc if version is specified
RUN set -eu && \
if [ -n "${MIMALLOC_VERSION}" ]; then install-mimalloc "${MIMALLOC_VERSION}"; fi
ENV ROCKSDB_VERSION=${ROCKSDB_VERSION}
# install rocksdb if version is specified
RUN set -eu && \
if [ -n "${ROCKSDB_VERSION}" ]; then install-rocksdb "${ROCKSDB_VERSION}"; fi
# download dependencies to cache as layer
WORKDIR ${GOPATH}/src/app
ENV GIT_TAG=${GIT_TAG} \
GIT_REPO=${GIT_REPO}
SHELL [ "/bin/bash", "-c" ]
RUN set -e && \
git clone -b ${GIT_TAG} https://github.com/${GIT_REPO}.git ./ && \
export GO_MOD_VERSION="$(awk '/^go /{print $2}' go.mod)" && \
if [[ "${GO_VERSION}" != "${GO_MOD_VERSION}"* ]]; then \
/bin/bash < <(curl -sSL https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer) && \
source ${HOME}/.gvm/scripts/gvm && \
gvm install go${GO_MOD_VERSION} && \
gvm use go${GO_MOD_VERSION}; \
fi && \
go mod download -x
# download wasmvm if version is specified
RUN set -ux && \
WASMVM_VERSION="$(go list -m github.com/CosmWasm/wasmvm | cut -d ' ' -f 2)" && \
[ -n "${WASMVM_VERSION}" ] && install-wasmvm "${WASMVM_VERSION}" || true
ARG BUILD_COMMAND="make install"
ARG BUILD_TAGS="muslc"
ARG COSMOS_BUILD_OPTIONS="nostrip"
ARG LDFLAGS='-extldflags "-Wl,-z,muldefs -static"'
# ARG LDFLAGS="-extldflags '-L/go/src/mimalloc/build -lmimalloc -Wl,-z,muldefs -static'"
# build the binary
ENV APP_NAME=${APP_NAME} \
BUILD_TAGS=${BUILD_TAGS} \
DENOM=${DENOM} \
LDFLAGS=${LDFLAGS} \
LEDGER_ENABLED=false \
LINK_STATICALLY=true
RUN set -eux && \
export COMMIT=GIT_COMMIT="$(git log -1 --format='%h')" && \
export VERSION=GIT_VERSION="$(git describe --tags --dirty --always)" && \
export DENOM=${DENOM:-"u$(echo ${APP_NAME} | head -c 4)"} && \
eval ${BUILD_COMMAND}
# verify static binary
RUN set -x && \
file ${GOPATH}/bin/${BIN_NAME} && \
echo "Ensuring binary is statically linked ..." && \
(file ${GOPATH}/bin/${BIN_NAME} | grep "statically linked")
# ################################################################################
FROM --platform=${BUILDPLATFORM} ${BASE_IMAGE} as prod
# build args passed down to env var
ARG APP_NAME="terra"
ARG BIN_NAME="${APP_NAME}d"
ARG CHAIN_REGISTRY_NAME
ENV APP_NAME=${APP_NAME} \
BIN_NAME=${BIN_NAME} \
CHAIN_REGISTRY_NAME=${CHAIN_REGISTRY_NAME}
# copy binary and entrypoint
COPY --from=builder /go/bin/${BIN_NAME} /usr/local/bin/${BIN_NAME}
COPY ./bin/entrypoint.sh /usr/local/bin/
# install jq and create user
RUN set -eux && \
pacman -Syyu --noconfirm jq && \
groupadd -g 1000 ${APP_NAME} && \
useradd -u 1000 -g ${APP_NAME} -s /bin/bash -d /home/${APP_NAME} ${APP_NAME} && \
ln -s /usr/local/bin/${BIN_NAME} /usr/local/bin/chaind
# setup execution environment
USER ${APP_NAME}
SHELL [ "/bin/bash" ]
WORKDIR /home/${APP_NAME}
ENTRYPOINT [ "entrypoint.sh" ]
CMD ["chaind", "start"]