instruction: Create a Dockerfile for Nginx with production best practices
output: ```dockerfile
  From Message
   ---- ------ ---- ---- -------
   Normal ScalingReplicaSet 2m deployment-controller Scaled up replica set nginx-deployment-2035384211 to 3
   Normal ScalingReplicaSet 24s deployment-controller Scaled up replica set nginx-deployment-1564180365 to 1
   Normal ScalingReplicaSet 22s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 2
   Normal ScalingReplicaSet 22s deployment-controller Scaled up replica set nginx-deployment-1564180365 to 2
   Normal ScalingReplicaSet 19s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 1
   Normal ScalingReplicaSet 19s deployment-controller Scaled up replica set nginx-deployment-1564180365 to 3
   Normal ScalingReplicaSet 14s deployment-controller Scaled down replica set nginx-deployment-2035384211 to 0
  Disini bisa dilihat ketika pertama Deployment dibuat, dia membuat ReplicaSet (nginx-deployment-2035384211)
  dan langsung menggandakannya menjadi 3 replika. Saat Deployment diperbarui, dia membuat ReplicaSet baru
  (nginx-deployment-1564180365) dan menambah 1 replika kemudian mengecilkan ReplicaSet lama menjadi 2,
  sehingga paling sedikit 2 Pod menyala dan paling banyak 4 Pod dibuat setiap saat. Dia kemudian lanjut menaik-turunkan
  ReplicaSet baru dan ReplicaSet lama, dengan strategi pembaruan rolling yang sama.
  Terakhir, kamu akan dapat 3 replika di ReplicaSet baru telah menyala, dan ReplicaSet lama akan hilang (berisi 0).Perpanjangan (alias banyak pembaruan secara langsung)Setiap kali Deployment baru is teramati oleh Deployment kontroler, ReplicaSet dibuat untuk membangkitkan Pod sesuai keinginan.
  Jika Deployment diperbarui, ReplicaSet yang terkait Pod dengan label .spec.selector yang cocok,
  namun kolom .spec.template pada templat tidak cocok akan dihapus. Kemudian, ReplicaSet baru akan
  digandakan sebanyak .spec.replicas dan semua ReplicaSet lama dihapus.Jika kamu mengubah Deployment saat rilis sedang berjalan, Deployment akan membuat ReplicaSet baru
  tiap perubahan dan memulai penggandaan. Lalu, dia akan mengganti ReplicaSet yang dibuat sebelumnya
  -- mereka ditambahkan ke dalam daftar ReplicaSet lama dan akan mulai dihapus.Contohnya, ketika kamu membuat Deployment untuk membangkitkan 5 replika nginx:1.7.9,
  kemudian membarui Deployment dengan versi nginx:1.9.1 ketika ada 3 replika nginx:1.7.9 yang dibuat.
  Dalam kasus ini, Deployment akan segera menghapus 3 replika Pod nginx:1.7.9 yang telah dibuat, dan mulai membuat
  Pod nginx:1.9.1. Dia tidak akan menunggu kelima replika nginx:1.7.9 selesai baru menjalankan perubahan.Mengubah selektor labelUmumnya, sekali dibuat, selektor label tidak boleh diubah. Sehingga disarankan untuk direncanakan dengan hati-hati sebelumnya.
  Bagaimanapun, jika kamu perlu mengganti selektor label, lakukan dengan seksama dan pastikan kamu tahu segala konsekuensinya.Catatan:Pada versi API apps/v1, selektor label Deployment tidak bisa diubah ketika selesai dibuat.Penambahan selektor mensyaratkan label templat Pod di spek Deployment untuk diganti dengan label baru juga.
  Jika tidak, galat validasi akan muncul. Perubahan haruslah tidak tumpang-tindih, dengan kata lain selektor baru tidak mencakup ReplicaSet dan Pod yang dibuat dengan selektor lama. Sehingga, semua ReplicaSet lama akan menggantung sedangkan ReplicaSet baru tetap dibuat.Pengubahan selektor mengubah nilai pada kunci selektor -- menghasilkan perilaku yang sama dengan penambahan.Penghapusan selektor menghilangkan kunci yang ada pada selektor Deployment -- tidak mensyaratkan perubahan apapun pada label templat Pod.
  ReplicaSet yang ada tidak menggantung dan ReplicaSet baru tidak dibuat.
  Tapi perhatikan bahwa label yang dihapus masih ada pada Pod dan ReplicaSet masing-masing.Membalikkan DeploymentKadang, kamu mau membalikkan Deployment; misalnya, saat Deployment tidak stabil, seperti crash looping.
  Umumnya, semua riwayat rilis Deployment disimpan oleh sistem sehingga kamu dapat kembali kapanpun kamu mau
  (kamu dapat mengubahnya dengan mengubah batas riwayat revisi).Catatan:Revisi Deployment dibuat saat rilis Deployment dipicu. Ini berarti revisi baru dibuat jika dan hanya jika
  templat Pod Deployment (.spec.template) berubah, misalnya jika kamu membarui label atau image kontainer pada templat.
  Pembaruan lain, seperti penggantian skala Deployment, tidak membuat revisi Deployment, jadi kamu dapat memfasilitasi
  penggantian skala secara manual atau otomatis secara simultan. Artinya saat kamu membalikkan ke versi sebelumnya,
  hanya bagian templat Pod Deployment yang dibalikkan.Misal kamu membuat saltik saat mengganti Deployment, dengan memberi nama image dengan nginx:1.91 alih-alih nginx:1.9.1:kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true
  Keluaran akan tampil seperti berikut:deployment.apps/nginx-deployment image updated
  Rilis akan tersendat. Kamu dapat memeriksanya dengan melihat status rilis:kubectl rollout status deployment.v1.apps/nginx-deployment
  Keluaran akan tampil seperti berikut:Waiting for rollout to finish: 1 out of 3 new replicas have been updated...
  Tekan Ctrl-C untuk menghentikan pemeriksaan status rilis di atas. Untuk info lebih lanjut
  tentang rilis tersendat, baca disini.Kamu lihat bahwa jumlah replika lama (nginx-deployment-1564180365 dan nginx-deployment-2035384211) adalah 2, dan replika baru (nginx-deployment-3066724191) adalah 1.kubectl get rs
  Keluaran akan tampil seperti berikut:NAME DESIRED CURRENT READY AGE
  nginx-deployment-1564180365 3 3 3 25s
  nginx-deployment-2035384211 0 0 0 36s
  nginx-deployment-3066724191 1 1 0 6s
  Lihat pada Pod yang dibuat. Akan ada 1 Pod dibuat dari ReplicaSet baru tersendat loop(?) ketika penarikan image.kubectl get pods
  Keluaran akan tampil seperti berikut:NAME READY STATUS RESTARTS AGE
  nginx-deployment-1564180365-70iae 1/1 Running 0 25s
  nginx-deployment-1564180365-jbqqo 1/1 Running 0 25s
  nginx-deployment-1564180365-hysrc 1/1 Running 0 25s
  nginx-deployment-3066724191-08mng 0/1 ImagePullBackOff 0 6s
  Catatan:Controller Deployment menghentikan rilis yang buruk secara otomatis dan juga berhenti meningkatkan ReplicaSet baru.
  Ini tergantung pada parameter rollingUpdate (secara khusus `maxUnavailable`) yang dimasukkan.
  Kubernetes umumnya mengatur jumlahnya menjadi 25%.
  Tampilkan deskripsi Deployment:kubectl describe deployment
  Keluaran akan tampil seperti berikut:Name: nginx-deployment
  Namespace: default
  CreationTimestamp: Tue, 15 Mar 2016 14:48:04 -0700
  Labels: app=nginx
  Selector: app=nginx
  Replicas: 3 desired | 1 updated | 4 total | 3 available | 1 unavailable
  StrategyType: RollingUpdate
  MinReadySeconds: 0
  RollingUpdateStrategy: 25% max unavailable, 25% max surge
  Pod Template:
   Labels: app=nginx
   Containers:
   nginx:
   Image: nginx:1.91
   Port: 80/TCP
   Host Port: 0/TCP
   Environment: <none>
   Mounts: <none>
   Volumes: <none>
  Conditions:
   Type Status Reason
   ---- ------ ------
   Available True MinimumReplicasAvailable
   Progressing True ReplicaSetUpdated
  OldReplicaSets: nginx-deployment-1564180365 (3/3 replicas created)
  NewReplicaSet: nginx-deployment-3066724191 (1/1 replicas created)
  Events:
   FirstSeen LastSeen Count
  ```