instruction: Create a comprehensive Dockerfile for cluster applications with best practices
output: ```dockerfile
  from API server first and re-added after the update.Self-registration of NodesWhen the kubelet flag --register-node is true (the default), the kubelet will attempt to
  register itself with the API server. This is the preferred pattern, used by most distros.For self-registration, the kubelet is started with the following options:--kubeconfig - Path to credentials to authenticate itself to the API server.--cloud-provider - How to talk to a cloud provider
  to read metadata about itself.--register-node - Automatically register with the API server.--register-with-taints - Register the node with the given list of
  taints (comma separated <key>=<value>:<effect>).No-op if register-node is false.--node-ip - Optional comma-separated list of the IP addresses for the node.
  You can only specify a single address for each address family.
  For example, in a single-stack IPv4 cluster, you set this value to be the IPv4 address that the
  kubelet should use for the node.
  See configure IPv4/IPv6 dual stack
  for details of running a dual-stack cluster.If you don't provide this argument, the kubelet uses the node's default IPv4 address, if any;
  if the node has no IPv4 addresses then the kubelet uses the node's default IPv6 address.--node-labels - Labels to add when registering the node
  in the cluster (see label restrictions enforced by the
  NodeRestriction admission plugin).--node-status-update-frequency - Specifies how often kubelet posts its node status to the API server.When the Node authorization mode and
  NodeRestriction admission plugin
  are enabled, kubelets are only authorized to create/modify their own Node resource.Note:As mentioned in the Node name uniqueness section,
  when Node configuration needs to be updated, it is a good practice to re-register
  the node with the API server. For example, if the kubelet is being restarted with
  a new set of --node-labels, but the same Node name is used, the change will
  not take effect, as labels are only set (or modified) upon Node registration with the API server.Pods already scheduled on the Node may misbehave or cause issues if the Node
  configuration will be changed on kubelet restart. For example, already running
  Pod may be tainted against the new labels assigned to the Node, while other
  Pods, that are incompatible with that Pod will be scheduled based on this new
  label. Node re-registration ensures all Pods will be drained and properly
  re-scheduled.Manual Node administrationYou can create and modify Node objects using
  kubectl.When you want to create Node objects manually, set the kubelet flag --register-node=false.You can modify Node objects regardless of the setting of --register-node.
  For example, you can set labels on an existing Node or mark it unschedulable.You can set optional node role(s) for nodes by adding one or more node-role.kubernetes.io/<role>: <role> labels to the node where characters of <role>
  are limited by the syntax rules for labels.Kubernetes ignores the label value for node roles; by convention, you can set it to the same string you used for the node role in the label key.You can use labels on Nodes in conjunction with node selectors on Pods to control
  scheduling. For example, you can constrain a Pod to only be eligible to run on
  a subset of the available nodes.Marking a node as unschedulable prevents the scheduler
  ```