From a3607842ef274a562fde4b83cfd305879e328aa0 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Thu, 16 Jun 2022 19:30:34 +0100 Subject: [PATCH] Updating the single image docker build to pin versions before build to allow it to work with develop etc. Also optimising the image a bit so that it can be built significantly faster. --- hosting/single/Dockerfile | 107 +++++++++++++++++--------------------- hosting/single/test.sh | 4 ++ scripts/pinVersions.js | 55 ++++++++++++-------- 3 files changed, 85 insertions(+), 81 deletions(-) create mode 100755 hosting/single/test.sh diff --git a/hosting/single/Dockerfile b/hosting/single/Dockerfile index 79d84f70c6..4490586906 100644 --- a/hosting/single/Dockerfile +++ b/hosting/single/Dockerfile @@ -1,79 +1,71 @@ -FROM couchdb +FROM couchdb:3.2.1 -ENV DEPLOYMENT_ENVIRONMENT=docker -ENV POSTHOG_TOKEN=phc_fg5I3nDOf6oJVMHSaycEhpPdlgS8rzXG2r6F2IpxCHS -ENV COUCHDB_PASSWORD=budibase -ENV COUCHDB_USER=budibase -ENV COUCH_DB_URL=http://budibase:budibase@localhost:5984 -ENV BUDIBASE_ENVIRONMENT=PRODUCTION -ENV MINIO_URL=http://localhost:9000 -ENV REDIS_URL=localhost:6379 -ENV WORKER_URL=http://localhost:4002 -ENV INTERNAL_API_KEY=budibase -ENV JWT_SECRET=testsecret -ENV MINIO_ACCESS_KEY=budibase -ENV MINIO_SECRET_KEY=budibase -ENV SELF_HOSTED=1 -ENV CLUSTER_PORT=10000 -ENV REDIS_PASSWORD=budibase -ENV ARCHITECTURE=amd -ENV APP_PORT=4001 -ENV WORKER_PORT=4002 +ENV DEPLOYMENT_ENVIRONMENT=docker \ + POSTHOG_TOKEN=phc_fg5I3nDOf6oJVMHSaycEhpPdlgS8rzXG2r6F2IpxCHS \ + COUCHDB_PASSWORD=budibase \ + COUCHDB_USER=budibase \ + COUCH_DB_URL=http://budibase:budibase@localhost:5984 \ + BUDIBASE_ENVIRONMENT=PRODUCTION \ + MINIO_URL=http://localhost:9000 \ + REDIS_URL=localhost:6379 \ + WORKER_URL=http://localhost:4002 \ + INTERNAL_API_KEY=budibase \ + JWT_SECRET=testsecret \ + MINIO_ACCESS_KEY=budibase \ + MINIO_SECRET_KEY=budibase \ + SELF_HOSTED=1 \ + CLUSTER_PORT=10000 \ + REDIS_PASSWORD=budibase \ + ARCHITECTURE=amd \ + APP_PORT=4001 \ + WORKER_PORT=4002 -RUN apt-get update -RUN apt-get install software-properties-common wget nginx -y -RUN apt-add-repository 'deb http://security.debian.org/debian-security stretch/updates main' -RUN apt-get update +# install base dependencies +RUN apt-get update && \ + apt-get install software-properties-common wget -y && \ + apt-add-repository 'deb http://security.debian.org/debian-security stretch/updates main' && \ + apt-get update + +# install other dependencies, nodejs, oracle requirements, jdk8, redis, nginx +WORKDIR /nodejs +RUN curl -sL https://deb.nodesource.com/setup_16.x -o /tmp/nodesource_setup.sh && \ + bash /tmp/nodesource_setup.sh && \ + apt-get install libaio1 nodejs nginx openjdk-8-jdk redis-server unzip -y && \ + npm install --global yarn pm2 # setup nginx ADD hosting/single/nginx.conf /etc/nginx -RUN mkdir /etc/nginx/logs -RUN useradd www -RUN touch /etc/nginx/logs/error.log -RUN touch /etc/nginx/logs/nginx.pid +RUN mkdir /etc/nginx/logs && \ + useradd www && \ + touch /etc/nginx/logs/error.log && \ + touch /etc/nginx/logs/nginx.pid -# install java -RUN apt-get install openjdk-8-jdk -y +# add pin script +WORKDIR / +ADD scripts/pinVersions.js . -# setup nodejs -WORKDIR /nodejs -RUN curl -sL https://deb.nodesource.com/setup_16.x -o /tmp/nodesource_setup.sh -RUN bash /tmp/nodesource_setup.sh -RUN apt-get install nodejs -RUN npm install --global yarn -RUN npm install --global pm2 - -# setup redis -RUN apt install redis-server -y - -# setup server +# setup server and install client for oracle datasource WORKDIR /app ADD packages/server . -RUN ls -al -RUN yarn -RUN yarn build -# Install client for oracle datasource -RUN apt-get install unzip libaio1 -RUN /bin/bash -e scripts/integrations/oracle/instantclient/linux/x86-64/install.sh +RUN node /pinVersions.js && yarn && yarn build && \ + /bin/bash -e scripts/integrations/oracle/instantclient/linux/x86-64/install.sh # setup worker WORKDIR /worker ADD packages/worker . -RUN yarn -RUN yarn build +RUN node /pinVersions.js && yarn && yarn build # setup clouseau WORKDIR / -RUN wget https://github.com/cloudant-labs/clouseau/releases/download/2.21.0/clouseau-2.21.0-dist.zip -RUN unzip clouseau-2.21.0-dist.zip -RUN mv clouseau-2.21.0 /opt/clouseau -RUN rm clouseau-2.21.0-dist.zip +RUN wget https://github.com/cloudant-labs/clouseau/releases/download/2.21.0/clouseau-2.21.0-dist.zip && \ + unzip clouseau-2.21.0-dist.zip && \ + mv clouseau-2.21.0 /opt/clouseau && \ + rm clouseau-2.21.0-dist.zip WORKDIR /opt/clouseau RUN mkdir ./bin ADD hosting/single/clouseau ./bin/ -ADD hosting/single/log4j.properties . -ADD hosting/single/clouseau.ini . +ADD hosting/single/log4j.properties hosting/single/clouseau.ini ./ RUN chmod +x ./bin/clouseau # setup CouchDB @@ -82,8 +74,7 @@ ADD hosting/single/vm.args ./etc/ # setup minio WORKDIR /minio -RUN wget https://dl.min.io/server/minio/release/linux-${ARCHITECTURE}64/minio -RUN chmod +x minio +RUN wget https://dl.min.io/server/minio/release/linux-${ARCHITECTURE}64/minio && chmod +x minio # setup runner file WORKDIR / diff --git a/hosting/single/test.sh b/hosting/single/test.sh new file mode 100755 index 0000000000..b9f9a4032c --- /dev/null +++ b/hosting/single/test.sh @@ -0,0 +1,4 @@ +#!/bin/bash +id=$(docker run -t -d -p 10000:10000 budibase:latest) +docker exec -it $id bash +docker kill $id diff --git a/scripts/pinVersions.js b/scripts/pinVersions.js index ecc605ad28..44cbba1090 100644 --- a/scripts/pinVersions.js +++ b/scripts/pinVersions.js @@ -3,35 +3,44 @@ const path = require("path") const MONOREPO_ROOT = "packages" -const packages = fs.readdirSync(MONOREPO_ROOT) +const packages = getPackages() + +function getPackages() { + if (fs.existsSync(MONOREPO_ROOT)) { + return fs.readdirSync(MONOREPO_ROOT).map(pkg => path.join(MONOREPO_ROOT, pkg)) + } else { + return ["./"] + } +} function pinDeps(dependencies) { - for (let dependency in dependencies) { - if (dependency.startsWith("@budibase")) { - dependencies[dependency] = dependencies[dependency].replace("^", "") - } - } + for (let dependency in dependencies) { + if (dependency.startsWith("@budibase")) { + dependencies[dependency] = dependencies[dependency].replace("^", "") + } + } + return dependencies } // iterate over the monorepo packages -for (let pkg of packages) { - const pkgPath = path.join(MONOREPO_ROOT, pkg) +for (let pkgPath of packages) { + // only directories + if (fs.statSync(pkgPath).isDirectory()) { + // get the package JSON file + const pkgJsonPath = path.join(pkgPath, "package.json") + if (!fs.existsSync(pkgJsonPath)) { + continue + } + const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath)) + - // only directories - if (fs.statSync(pkgPath).isDirectory()) { + // find any budibase dependencies, and pin them + pkgJson.dependencies = pinDeps(pkgJson.dependencies) + pkgJson.devDependencies = pinDeps(pkgJson.devDependencies) - - // get the package JSON file - const pkgJsonPath = path.join(pkgPath, "package.json") - const pkgJson = require(`../${pkgJsonPath}`) - - // find any budibase dependencies, and pin them - pinDeps(pkgJson.dependencies) - pinDeps(pkgJson.devDependencies) - - // update the package JSON files - fs.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2)) - } + // update the package JSON files + fs.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2)) + } } -console.log("Pinned dev versions for budibase packages successfully.") \ No newline at end of file +console.log("Pinned dev versions for budibase packages successfully.")