build_docker.sh 2.81 KB
Newer Older
Michael Yang's avatar
Michael Yang committed
1
2
3
4
#!/bin/sh

set -eu

5
export VERSION=${VERSION:-$(git describe --tags --first-parent --abbrev=7 --long --dirty --always | sed -e "s/^v//g")}
6
export GOFLAGS="'-ldflags=-w -s \"-X=github.com/ollama/ollama/version.Version=$VERSION\" \"-X=github.com/ollama/ollama/server.mode=release\"'"
Michael Yang's avatar
Michael Yang committed
7

8
9
10
11
12
# We use 2 different image repositories to handle combining architecture images into multiarch manifest
# (The ROCm image is x86 only and is not a multiarch manifest)
# For developers, you can override the DOCKER_ORG to generate multiarch manifests
#  DOCKER_ORG=jdoe PUSH=1 ./scripts/build_docker.sh
DOCKER_ORG=${DOCKER_ORG:-"ollama"}
13
RELEASE_IMAGE_REPO=${RELEASE_IMAGE_REPO:-"${DOCKER_ORG}/release"}
14
15
16
17
18
19
20
21
22
23
24
25
26
27
FINAL_IMAGE_REPO=${FINAL_IMAGE_REPO:-"${DOCKER_ORG}/ollama"}

BUILD_ARCH=${BUILD_ARCH:-"amd64 arm64"}

# Set PUSH to a non-empty string to trigger push instead of load
PUSH=${PUSH:-""}

# In CI mode, we break things down
OLLAMA_SKIP_MANIFEST_CREATE=${OLLAMA_SKIP_MANIFEST_CREATE:-""}
OLLAMA_SKIP_IMAGE_BUILD=${OLLAMA_SKIP_IMAGE_BUILD:-""}

if [ -z "${PUSH}" ] ; then
    LOAD_OR_PUSH="--load"
else
28
    echo "Will be pushing ${RELEASE_IMAGE_REPO}:$VERSION for ${BUILD_ARCH}"
29
30
31
32
33
34
35
36
37
38
39
    LOAD_OR_PUSH="--push"
fi

if [ -z "${OLLAMA_SKIP_IMAGE_BUILD}" ]; then
    for TARGETARCH in ${BUILD_ARCH}; do
        docker build \
            ${LOAD_OR_PUSH} \
            --platform=linux/${TARGETARCH} \
            --build-arg=VERSION \
            --build-arg=GOFLAGS \
            -f Dockerfile \
40
            -t ${RELEASE_IMAGE_REPO}:$VERSION-${TARGETARCH} \
41
42
43
44
45
46
47
48
49
50
51
            .
    done

    if echo ${BUILD_ARCH} | grep "amd64" > /dev/null; then
        docker build \
            ${LOAD_OR_PUSH} \
            --platform=linux/amd64 \
            --build-arg=VERSION \
            --build-arg=GOFLAGS \
            --target runtime-rocm \
            -f Dockerfile \
52
            -t ${RELEASE_IMAGE_REPO}:$VERSION-rocm \
53
54
55
56
57
58
59
            .
    fi
fi

if [ -z "${OLLAMA_SKIP_MANIFEST_CREATE}" ]; then
    if [ -n "${PUSH}" ]; then
        docker manifest create ${FINAL_IMAGE_REPO}:$VERSION \
60
61
            ${RELEASE_IMAGE_REPO}:$VERSION-amd64 \
            ${RELEASE_IMAGE_REPO}:$VERSION-arm64
62
63
64
        docker manifest push ${FINAL_IMAGE_REPO}:$VERSION

        # For symmetry, tag/push the rocm image
65
        if [ "${RELEASE_IMAGE_REPO}" != "${FINAL_IMAGE_REPO}" ]; then
66
            echo "Tagging and pushing rocm image"
67
68
            docker pull ${RELEASE_IMAGE_REPO}:$VERSION-rocm
            docker tag ${RELEASE_IMAGE_REPO}:$VERSION-rocm ${FINAL_IMAGE_REPO}:$VERSION-rocm
69
70
71
72
            docker push ${FINAL_IMAGE_REPO}:$VERSION-rocm
        fi
    else
        echo "Skipping manifest generation when not pushing images are available locally as "
73
74
75
        echo "  ${RELEASE_IMAGE_REPO}:$VERSION-amd64"
        echo "  ${RELEASE_IMAGE_REPO}:$VERSION-arm64"
        echo "  ${RELEASE_IMAGE_REPO}:$VERSION-rocm"
76
    fi
77
fi