instruction: Create a Dockerfile for Node.js with production best practices
output: ```dockerfile
  from underlying host infrastructure to make deployment easier in different cloud or OS environments, and for easier scaling.
  The applications that run inside containers are called containerized applications. The process of bundling these applications and their dependencies into a container image is called containerization.Container Environment VariablesContainer environment variables are name=value pairs that provide useful information into containers running in a pod[+]Container environment variables provide information that is required by the running containerized applications along with information about important resources to the containers. For example, file system details, information about the container itself, and other cluster resources such as service endpoints.Container Lifecycle HooksThe lifecycle hooks expose events in the Container management lifecycle and let the user run code when the events occur.[+]Two hooks are exposed to Containers: PostStart which executes immediately after a container is created and PreStop which is blocking and is called immediately before a container is terminated.Container network interface (CNI)Container network interface (CNI) plugins are a type of Network plugin that adheres to the appc/CNI specification.[+]For information on Kubernetes and CNI, see Network Plugins.Container RuntimeA fundamental component that empowers Kubernetes to run containers effectively.
  It is responsible for managing the execution and lifecycle of containers within the Kubernetes environment.[+]Kubernetes supports container runtimes such as
  containerd, CRI-O,
  and any other implementation of the Kubernetes CRI (Container Runtime
  Interface).Container Runtime Interface (CRI)The main protocol for the communication between the kubelet and Container Runtime.[+]The Kubernetes Container Runtime Interface (CRI) defines the main
  gRPC protocol for the communication between the
  node components
  kubelet and
  container runtime.Container Storage Interface (CSI)The Container Storage Interface (CSI) defines a standard interface to expose storage systems to containers.[+]CSI allows vendors to create custom storage plugins for Kubernetes without adding them to the Kubernetes repository (out-of-tree plugins). To use a CSI driver
  ```