instruction: Create a Dockerfile for Node.js with production best practices
output: ```dockerfile
  From Message
   ---- ------ ---- ---- -------
   Warning FailedScheduling 23s default-scheduler 0/42 nodes available: insufficient cpu
  In the preceding example, the Pod named "frontend" fails to be scheduled due to
  insufficient CPU resource on any node. Similar error messages can also suggest
  failure due to insufficient memory (PodExceedsFreeMemory). In general, if a Pod
  is pending with a message of this type, there are several things to try:
  
  Add more nodes to the cluster.
  Terminate unneeded Pods to make room for pending Pods.
  Check that the Pod is not larger than all the nodes. For example, if all the
  nodes have a capacity of cpu: 1, then a Pod with a request of cpu: 1.1 will
  never be scheduled.
  Check for node taints. If most of your nodes are tainted, and the new Pod does
  not tolerate that taint, the scheduler only considers placements onto the
  remaining nodes that don't have that taint.
  
  You can check node capacities and amounts allocated with the
  kubectl describe nodes command. For example:
  kubectl describe nodes e2e-test-node-pool-4lw4
  Name: e2e-test-node-pool-4lw4
  [ ... lines removed for clarity ...]
  Capacity:
   cpu: 2
   memory: 7679792Ki
   pods: 110
  Allocatable:
   cpu: 1800m
   memory: 7474992Ki
   pods: 110
  [ ... lines removed for clarity ...]
  Non-terminated Pods: (5 in total)
   Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits
   --------- ---- ------------ ---------- --------------- -------------
   kube-system fluentd-gcp-v1.38-28bv1 100m (5%) 0 (0%) 200Mi (2%) 200Mi (2%)
   kube-system kube-dns-3297075139-61lj3 260m (13%) 0 (0%) 100Mi (1%) 170Mi (2%)
   kube-system kube-proxy-e2e-test-... 100m (5%) 0 (0%) 0 (0%) 0 (0%)
   kube-system monitoring-influxdb-grafana-v4-z1m12 200m (10%) 200m (10%) 600Mi (8%) 600Mi (8%)
   kube-system node-problem-detector-v0.1-fj7m3 20m (1%) 200m (10%) 20Mi (0%) 100Mi (1%)
  Allocated resources:
   (Total limits may be over 100 percent, i.e., overcommitted.)
   CPU Requests CPU Limits Memory Requests Memory Limits
   ------------ ---------- --------------- -------------
   680m (34%) 400m (20%) 920Mi (11%) 1070Mi (13%)
  In the preceding output, you can see that if a Pod requests more than 1.120 CPUs
  or more than 6.23Gi of memory, that Pod will not fit on the node.
  By looking at the “Pods” section, you can see which Pods are taking up space on
  the node.
  The amount of resources available to Pods is less than the node capacity because
  system daemons use a portion of the available resources. Within the Kubernetes API,
  each Node has a .status.allocatable field
  (see NodeStatus
  for details).
  The .status.allocatable field describes the amount of resources that are available
  to Pods on that node (for example: 15 virtual CPUs and 7538 MiB of memory).
  For more information on node allocatable resources in Kubernetes, see
  Reserve Compute Resources for System Daemons.
  You can configure resource quotas
  to limit the total amount of resources that a namespace can consume.
  Kubernetes enforces quotas for objects in particular namespace when there is a
  ResourceQuota in that namespace.
  For example, if you assign specific namespaces to different teams, you
  can add ResourceQuotas into those namespaces. Setting resource quotas helps to
  prevent one team
  ```