# ht-docker-node docker image with nodejs and shipzone.io support ## Install To get started with `ht-docker-node`, you need to have Docker installed on your machine. You can then pull the desired flavor of the Docker image from the relevant Docker registry. Example: ```bash docker pull registry.gitlab.com/hosttoday/ht-docker-node:latest ``` ## Usage `ht-docker-node` offers a variety of Docker image flavors to suit different needs. Below, we'll guide you through different use cases and configurations using these Docker images. ### Flavour Overview - **:lts** - Node LTS version, equivalent to :latest - **:stable** - Node stable version - **:npmci** - `npmci` preinstalled - **:npmts** - `npmci` + `npmts` preinstalled - **:npmpage** - `npmci` + `npmts` + `npmpage` preinstalled - **:mongo** - `npmci` + `npmts` + `mongo` ### Basic Usage To start a container with the `lts` flavour, you can use the following command: ```bash docker run -it --name your_container_name registry.gitlab.com/hosttoday/ht-docker-node:lts ``` ### Using `npmci` The `:npmci` flavour includes `npmci`, a utility for managing Node.js versions and npm installations. Here's an example of how you can use it: ```Dockerfile FROM registry.gitlab.com/hosttoday/ht-docker-node:npmci RUN npmci install 14.17.0 ``` In this example, `npmci` installs Node.js version `14.17.0` and sets it as the default. ### Using NVM in Dockerfiles The base image includes **nvm (Node Version Manager)** for flexible Node.js version management. Use nvm commands directly in Dockerfile RUN statements without any sourcing required: ```dockerfile FROM registry.gitlab.com/hosttoday/ht-docker-node:latest # Use nvm directly - no sourcing needed RUN nvm install 18.20.0 RUN nvm use 18 && npm install # Or chain commands RUN nvm install 19.0.0 && nvm use 19 && npm ci ``` **Important**: Each RUN command is a separate shell. To persist version changes across RUN commands, set a new default: ```dockerfile RUN nvm install 18.20.0 && nvm alias default 18 # Subsequent RUN commands will use v18 by default ``` ### Using NVM in CI/CD Workflows NVM is automatically available in CI/CD workflow scripts when using `bash -c`: ```yaml jobs: build: runs-on: ubuntu-latest container: image: registry.gitlab.com/hosttoday/ht-docker-node:latest steps: - name: Use specific Node version run: | nvm install 18.20.0 nvm use 18 npm install npm test - name: Test multiple versions run: | for version in 16 18 20; do nvm install $version nvm use $version npm test done ``` ### NVM vs npmci Both tools are available in the image: - **nvm**: Standard Node version manager, works in Dockerfiles and CI/CD workflows - **npmci**: CI-focused wrapper with additional shipzone.io features Choose based on your preference - they work together seamlessly. ### Custom Dockerfile with `npmci` and your Node.js App You can create a custom Dockerfile for your Node.js application using the `:npmci` flavour: ```Dockerfile # Use the ht-docker-node image with npmci FROM registry.gitlab.com/hosttoday/ht-docker-node:npmci # Install a specific Node.js version RUN npmci install 14.17.0 # Create app directory WORKDIR /usr/src/app # Copy package.json and package-lock.json COPY package*.json ./ # Install app dependencies RUN npm install # Bundle app source COPY . . # Expose port EXPOSE 8080 # Start the application CMD ["node", "index.js"] ``` To build the Docker image: ```bash docker build -t your_app_name . ``` To run the container: ```bash docker run -p 8080:8080 --name your_container_name your_app_name ``` ### Multi-Stage Builds for Production For a leaner production image, you can use multi-stage builds. Here’s an example: ```Dockerfile # Stage 1: Build FROM registry.gitlab.com/hosttoday/ht-docker-node:npmci as build RUN npmci install 14.17.0 WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # Stage 2: Production FROM registry.gitlab.com/hosttoday/ht-docker-node:lts WORKDIR /usr/src/app COPY --from=build /usr/src/app/dist ./ EXPOSE 8080 CMD ["node", "index.js"] ``` ### Using with MongoDB (`:mongo`) The `:mongo` flavour contains a MongoDB installation alongside Node.js. Here’s how you can utilize it in your Dockerfile: ```Dockerfile FROM registry.gitlab.com/hosttoday/ht-docker-node:mongo # Setup mongo and node environment: RUN npm install -g mongodb # Working directory WORKDIR /usr/src/app # Copy MongoDB config COPY mongod.conf /etc/mongod.conf # Start MongoDB service CMD ["mongod", "--config", "/etc/mongod.conf"] && node index.js ``` ### Using `npmts` and `npmpage` The `:npmts` and `:npmpage` flavours are useful for projects that use TypeScript or require page generation. Here’s an example on how to work with `:npmts`: ```Dockerfile FROM registry.gitlab.com/hosttoday/ht-docker-node:npmts # Install necessary TypeScript packages RUN npm install -g typescript # Working directory WORKDIR /usr/src/app # Copy package.json and package-lock.json COPY package*.json ./ # Install dependencies RUN npm install # Copy the rest of your files COPY . . # Compile TypeScript RUN npm run build # Expose port and start the server EXPOSE 3000 CMD ["npm", "start"] ``` ### Comprehensive Use Case Example The following example covers multiple aspects including environment variables, volume mounting, and networking. #### Dockerfile: ```Dockerfile FROM registry.gitlab.com/hosttoday/ht-docker-node:npmci # Set environment variables ENV NODE_ENV=production ENV PORT=3000 # Install desired Node.js version RUN npmci install 16.0.0 # Create app directory WORKDIR /usr/src/app # Copy package.json and package-lock.json COPY package*.json ./ # Install app dependencies RUN npm ci # Bundle app source COPY . . # Compile TypeScript RUN npm run build # Expose app port EXPOSE 3000 # Start the application CMD ["npm", "start"] ``` #### Docker-Compose Configuration If using Docker-Compose, create a `docker-compose.yml` file: ```yaml version: '3.8' services: app: image: your_app_name build: context: . dockerfile: Dockerfile ports: - '3000:3000' environment: - NODE_ENV=production volumes: - .:/usr/src/app - /usr/src/app/node_modules networks: - app-network networks: app-network: driver: bridge ``` #### Running with Docker and Docker-Compose To build the image: ```bash docker-compose build ``` To run the services: ```bash docker-compose up ``` #### Accessing the Container ```bash docker exec -it your_container_name /bin/sh ``` ### Conclusion `ht-docker-node` offers a flexible, multifaceted solution for deploying Node.js applications in Docker containers. By leveraging its different flavours, you can efficiently manage Node.js versions, incorporate MongoDB, and handle TypeScript projects. Whether you are using simple Docker commands or elaborate Docker-Compose configurations, `ht-docker-node` caters to diverse deployment scenarios. ## License and Legal Information This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository. **Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file. ### Trademarks This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH. ### Company Information Task Venture Capital GmbH Registered at District court Bremen HRB 35230 HB, Germany For any legal inquiries or if you require further information, please contact us via email at hello@task.vc. By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.