Skip to content

Instantly share code, notes, and snippets.

@osher
osher / the.getting-started.improfessional.Dockerfile
Created May 8, 2023 14:58
the getting-started Dockerfile you get for nodejs docker images
View the.getting-started.improfessional.Dockerfile
FROM node:lts
WORKDIR /app
COPY . .
RUN npm i
EXPOSE 3000/tcp
CMD ["npm", "start"]
@osher
osher / node-service.multiphase.Dockerfile
Last active May 9, 2023 07:50
Example for the Dockerfile for node-services using an multi-phase build with optimized node-builder and node-runner.
View node-service.multiphase.Dockerfile
ARG TAG_NODE_BUILDER=latest
FROM my-private-cr/node-builder:$TAG_NODE_BUILDER
COPY packge.json .
RUN npm i --production
ARG TAG_NODE_RUNNER=latest
FROM my-private-cr/node-runner:$TAG_NODE_RUNNER
COPY from=0 /app /
COPY . /app/
RUN apk update --no-cache
@osher
osher / node-runner.Dockerfile
Created May 8, 2023 11:05
An example for a node-runner - a base image for the last step on a multi-phase build for node services
View node-runner.Dockerfile
ARG TAG_ALPINE_BASE=latest
FROM alpine:$TAG_ALPINE_BASE
RUN apk update --no-cache \
&& apk upgrade --no-cache \
&& apk add --no-cache nodejs
WORKDIR /app
RUN addgroup -S service \
&& adduser -S service -G service
@osher
osher / example.for.node-builder.Dockerfile
Last active May 8, 2023 12:45
A dockerfile to create a base image for building npm packages
View example.for.node-builder.Dockerfile
ARG TAG_NODE_BASE=lts
FROM node:$TAG_NODE_BASE
WORKDIR /app
RUN apk update --no-cache \
&& apk upgrade --no-cache \
&& apk add --no-cache \
build-base \
openssh \
View two-phase--not-optimized.Dockerfile
FROM node:alpine-lts
WORKDIR /app
COPY packge.json .
RUN npm i --production
FROM alpine
RUN apk update \
&& apk upgrade --no-cache \
&& apk add --no-cache nodejs \
&& rm -r /**/apk /**/**/apk
@osher
osher / sops-with-age-encryption.demo.sh
Last active April 17, 2023 07:16
The simplest sops demo - sops using age encryption
View sops-with-age-encryption.demo.sh
# This demo uses an alpine sandbox in a docker container in
# interactive mode. ran with:
# docker run --rm -it alpine
#
# if you run it on your own system:
# 1. you should use your own package manager instead of `apk`
# 2. expect the following left overs:
# - installed binaries (age, age-keygen, sops)
# - $HOME/.config/sops/age/keys.txt
# - demo files: source.env, encrypted.env, decrypted.env
@osher
osher / separated-concerns-frameworkless-http-server.js
Last active September 14, 2022 18:03
A "frameworkless" http-server - with separation of concerns
View separated-concerns-frameworkless-http-server.js
//code concern
//-------------------------------------------------------------------
const conf = () => { //config
views: { //config
status: 'i\'m alive', //config
greet: 'hello, %s', //config
help: 'supports: /greet or /status', //config
}, //config
web: { port: 3000 }, //config
}; //config
@osher
osher / mixed-concerns-frameworkless-http-server.js
Last active September 12, 2022 16:13
A "frameworkless" http-server - using naive code (mixed concerns)
View mixed-concerns-frameworkless-http-server.js
//code concerns
//-------------------------------------------------------------------
console.log('starting greeter'); //binary+logging
require('http').createServer((req, res) => { //binary+app
const [action] = req.url.slice(1).match(/[^\/]+/); //route
switch(true) { //route
case action == 'status': //webCtrl
return res.end('i\'m alive'); //view+webCtrl
View example.for.test.factory.js
/**
Consider the language did not provide us with `.indexOf` and we had to implement it ourselves.
Given that the factory is already implemented, how easy is it to add a new case.
Mind how hoisting helps keep the higher levels above, while implementation details are below.
*/
const Should = require('should');
const SUT = require('./index-of');
View better-example.test.js
/**
This is a better example that does a better job both in testing and in communicating the test-intent.
(with some skipped parts to keep things short)
*/
const helper = require('./helper');
const { user } = require('./fixture');
const SUT = require('../lib/accounts');
const Should = require('should');
describe('lib/accounts - accounts service', () => {