Преглед изворни кода

feat: build and publish docker image with snowflake odbc driver

Ivan Dyachkov пре 1 година
родитељ
комит
7522fa20fc

+ 14 - 1
.github/workflows/build_and_push_docker_images.yaml

@@ -192,7 +192,7 @@ jobs:
 
       - name: export docker image
         run: |
-          docker save $_EMQX_DOCKER_IMAGE_TAG | gzip > $PROFILE-docker-$PKG_VSN.tar.gz
+          docker save "${_EMQX_DOCKER_IMAGE_TAG}" | gzip > $PROFILE-docker-$PKG_VSN.tar.gz
 
       - uses: actions/upload-artifact@89ef406dd8d7e03cfd12d9e0a4a378f454709029 # v4.3.5
         with:
@@ -209,3 +209,16 @@ jobs:
           DOCKER_LOAD: false
         run: |
           ./build ${PROFILE} docker
+
+      - name: Build and publish docker image with Snowflake ODBC driver
+        if: (inputs.publish || github.repository_owner != 'emqx') && matrix.profile[0] == 'emqx-enterprise'
+        env:
+          DOCKER_PUSH: true
+          DOCKER_BUILD_NOCACHE: false
+          DOCKER_PLATFORMS: linux/amd64,linux/arm64
+          DOCKER_LOAD: false
+          EMQX_DOCKERFILE: deploy/docker/Dockerfile.sfodbc
+        run: |
+          export BUILD_FROM="${_EMQX_DOCKER_IMAGE_TAG}"
+          export EMQX_IMAGE_TAG="${_EMQX_DOCKER_IMAGE_TAG##docker.io/}-sf"
+          ./build ${PROFILE} docker

+ 27 - 0
deploy/docker/Dockerfile.sfodbc

@@ -0,0 +1,27 @@
+## Extended version of emqx/emqx-enterprise image with Snowflake ODBC driver
+## docker build -f deploy/docker/Dockerfile.sfodbc \
+##   --build-arg BUILD_FROM=emqx/emqx-enterprise:5.8.0 \
+##   -t emqx/emqx-enterprise:5.8.0-sf .
+##
+## or like this
+##
+## DOCKER_BUILD_NOCACHE=true \
+## PKG_VSN=5.8.1-alpha.2-sf \
+## EMQX_DOCKERFILE=deploy/docker/Dockerfile.sfodbc \
+## BUILD_FROM=emqx/emqx-enterprise:5.8.1-alpha.2 \
+## EMQX_IMAGE_TAG=emqx/emqx-enterprise:5.8.1-alpha.2-sf \
+## ./build emqx-enterprise docker
+
+ARG BUILD_FROM=emqx/emqx-enterprise:5.8.1-alpha.2
+FROM $BUILD_FROM
+
+USER root
+
+COPY scripts/install-snowflake-driver.sh ./
+
+RUN ./install-snowflake-driver.sh && \
+    rm -f snowflake-odbc*.deb install-snowflake-driver.sh && \
+    apt-get clean && \
+    rm -rf /var/lib/apt/lists/*
+
+USER emqx

+ 47 - 28
scripts/install-snowflake-driver.sh

@@ -1,42 +1,61 @@
 #!/usr/bin/env bash
 
+# Install the Snowflake ODBC driver on a Debian-based system.
+# https://developers.snowflake.com/odbc/
+
 set -xeuo pipefail
 
-## Specify your organization - account name as the account identifier
-SFACCOUNT=${SFACCOUNT:-myorganization-myaccount}
-VERSION="3.3.2"
-FILE="snowflake-odbc-${VERSION}.x86_64.deb"
-URL="https://sfc-repo.snowflakecomputing.com/odbc/linux/${VERSION}/${FILE}"
-SHA256="fdcf83aadaf92ec135bed0699936fa4ef2cf2d88aef5a4657a96877ae2ba232d"
+if [ ! -f /etc/debian_version ]; then
+  echo "This script is only intended for Debian-based systems"
+  exit 1
+fi
 
-if [[ -f "${FILE}" && $(sha256sum "${FILE}" | cut -f1 -d' ') == "${SHA256}" ]]; then
-  echo "snowflake package already downloaded"
-else
-  echo "downloading snowflake package"
-  wget -nc "$URL"
+if dpkg -l snowflake-odbc 1>/dev/null 2>/dev/null ; then
+  echo "Snowflake ODBC driver is already installed"
+  exit 0
 fi
 
-function configure() {
-  ODBC_INST_LIB=/usr/lib/x86_64-linux-gnu/libodbcinst.so
+VERSION="3.4.1"
+BASE_URL="https://sfc-repo.snowflakecomputing.com/odbc"
+ARCH="$(uname -m)"
+FILE="snowflake-odbc-${VERSION}.${ARCH}.deb"
+if [ "${ARCH}" == x86_64 ]; then
+  URL="${BASE_URL}/linux/${VERSION}/${FILE}"
+  SHA256="a96fcc89a3d3f2d16fc492976a01fefae57029bcd2e238ff4eff5a6693fa4f74"
+elif [ "${ARCH}" == aarch64 ]; then
+  URL="${BASE_URL}/linux${ARCH}/${VERSION}/${FILE}"
+  SHA256="c9f5c60ace416640683693037d5949aefea9555b9aa62501b6b6c692d140989c"
+else
+  echo "Unsupported architecture: ${ARCH}"
+  exit 1
+fi
 
-  sed -i -e "s#^ODBCInstLib=.*#ODBCInstLib=$ODBC_INST_LIB#" /usr/lib/snowflake/odbc/lib/simba.snowflake.ini
+if [[ -f "${FILE}" && $(echo "$SHA256 *$FILE" | sha256sum -c) ]]; then
+    echo "Snowflake ODBC driver package is already downloaded"
+else
+    apt-get -qq update && apt-get install -yqq curl
+    curl -fsSL -O --retry 5 "$URL"
+    echo "$SHA256 *$FILE" | sha256sum -c
+fi
 
-  sed -i -e "s#SF_ACCOUNT#${SFACCOUNT}#" /etc/odbc.ini
+apt-get -qq update
+apt-get install -yqq unixodbc-dev unixodbc odbcinst curl libreadline8
+apt-get install -yqq "./${FILE}"
 
-  cat >>/etc/odbc.ini  <<EOF
-[ODBC Data Sources]
-snowflake = SnowflakeDSIIDriver
-EOF
-}
+# Fix the path to the libodbcinst.so library in the simba.snowflake.ini file.
+ODBC_INST_LIB="/usr/lib/${ARCH}-linux-gnu/libodbcinst.so"
+sed -i -e "s#^ODBCInstLib=.*#ODBCInstLib=$ODBC_INST_LIB#" /usr/lib/snowflake/odbc/lib/simba.snowflake.ini
 
-if ! dpkg -l snowflake-odbc 1>/dev/null 2>/dev/null ; then
-  apt update && apt install -yyq unixodbc-dev odbcinst
-  dpkg -i "${FILE}"
-  apt install -f
+# Remove references to SF_ACCOUNT from the odbc.ini file.
+# It will be configured dynamically.
+sed -i '/^SERVER/d' /etc/odbc.ini
+sed -i '/^ACCOUNT/d' /etc/odbc.ini
 
-  configure
+ODBC_INI_CONTENT="[ODBC Data Sources]
+snowflake = SnowflakeDSIIDriver"
 
-  echo "installed and configured snowflake"
-else
-  echo "snowflake odbc already installed; not attempting to configure it"
+if ! grep -Fxq "$ODBC_INI_CONTENT" /etc/odbc.ini; then
+    cat >>/etc/odbc.ini <<EOF
+$ODBC_INI_CONTENT
+EOF
 fi