Docker Exec - Cara Menjalankan Perintah di Dalam Gambar Docker atau Container

Saya akan memberi tahu Anda tentang rahasia DevOps di sini: Hal yang disukai semua orang DevOpsy adalah membangun sistem yang super mewah dan kompleks, lalu temukan cara untuk menghadapinya seperti shell biasa. Atau hubungkan dengan SSH dan perlakukan seperti shell biasa.

Docker tidak berbeda! Anda menjalankan komputer di dalam komputer lain. Mungkin komputer itu adalah instance EC2 atau laptop. Anda bahkan bisa menjadi sangat gila dan menjalankan VM yang kemudian menjalankan Docker.

Sebagian besar waktu ketika saya menggunakan Docker, saya menggunakannya untuk mengemas dan mendistribusikan aplikasi. Terkadang saya menggunakannya untuk sesuatu yang lebih keren seperti proyek komputasi terdistribusi. Tetapi sering kali saya membuang Dockerfile di repo GitHub sehingga saya tidak perlu menginstal CLI yang saya tahu pada akhirnya akan konflik di laptop saya.

Singkatnya, Anda dapat memberi tahu Docker untuk menjalankan perintah bash, yang menempatkan Anda di shell:

docker run -it name-of-image bash # docker run -it continuumio/miniconda3:latest bash # docker run -it node:latest bash

Tapi teruslah membaca untuk informasi lebih lanjut. ;-)

Cobalah

Google Docker up bahasa pemrograman favorit Anda. Bagi saya ini Python, dan secara khusus saya suka conda. Kemudian jalankan beberapa perintah untuk memastikan bahwa Anda sebenarnya berada di shell itu.

# From Host echo $(pwd) # Drop into docker shell docker run -it continuumio/miniconda3:latest bash # Now you are in the docker shell! echo $(pwd) echo $USER

Keren, ya? Ini sangat cocok untuk men-debug container yang seharusnya berfungsi dengan baik. Ini juga bagus untuk kasus penggunaan "Saya tidak ingin menginstal ini ke komputer saya" yang paling umum.

Debug Build Docker dengan Docker Run

Memperlakukan image Docker Anda seperti shell biasa akan berguna saat mencoba men-debug build Docker.

Katakanlah Anda memiliki Dockerfile untuk gambar yang Anda coba buat. Biasanya yang terjadi adalah ketika menjalankan docker build -t my-image .(-t untuk tag) Docker akan menjalankan setiap langkah RUN Anda, dan berhenti ketika perintah tersebut tidak keluar dengan benar.

Dalam shell UNIX, kode keluar 0 berarti semua baik-baik saja dengan sebuah perintah. Jadi untuk mengilustrasikan poin ini saya telah membuat Dockerfile kami memiliki perintah RUN yang keluar dengan 1.

FROM continuumio/miniconda3:latest RUN apt-get update -y; \ apt-get upgrade -y; \ apt-get install -y \ vim-tiny vim-athena build-essential RUN conda update conda \ && conda clean --all --yes RUN exit 1
docker build -t my-image .

Ini akan memberi Anda output yang terlihat seperti:

(base) ➜ my-image docker build -t my-image . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM continuumio/miniconda3:latest ---> 406f2b43ea59 Step 2/4 : RUN apt-get update -y; apt-get upgrade -y; apt-get install -y vim-tiny vim-athena build-essential ---> Using cache ---> 726af29a48a0 Step 3/4 : RUN conda update conda && conda clean --all --yes ---> Using cache ---> 19478bb3ce67 Step 4/4 : RUN exit 1 ---> Running in 7c98aab6b52c The command '/bin/sh -c exit 1' returned a non-zero code: 1

Anda dapat mengonfirmasi bahwa image Docker Anda tidak dibuat dengan menjalankan docker imagesdan memeriksa my-image. Itu tidak akan ada di sana karena tidak berhasil dibangun.

Sekarang yang bisa kita lakukan adalah mengomentari perintah Dockerfile RUN yang merepotkan itu.

FROM continuumio/miniconda3:latest RUN apt-get update -y; \ apt-get upgrade -y; \ apt-get install -y \ vim-tiny vim-athena build-essential RUN conda update conda \ && conda clean --all --yes #RUN exit 1

Maka yang akan Anda lihat adalah:

Sending build context to Docker daemon 2.048kB Step 1/3 : FROM continuumio/miniconda3:latest ---> 406f2b43ea59 Step 2/3 : RUN apt-get update -y; apt-get upgrade -y; apt-get install -y vim-tiny vim-athena build-essential ---> Using cache ---> 726af29a48a0 Step 3/3 : RUN conda update conda && conda clean --all --yes ---> Using cache ---> 19478bb3ce67 Successfully built 19478bb3ce67 Successfully tagged my-image:latest 

Anda sekarang dapat masuk ke image Docker Anda dan mulai menjalankan perintah secara interaktif!

docker run -it my-image bash # you can also run # docker run -it my-image:latest bash

Dari sini, satu per satu, Anda dapat mulai men-debug perintah RUN Anda untuk melihat apa yang salah. Jika Anda tidak yakin apakah sebuah perintah keluar dengan benar atau tidak, jalankan $?:

# First run docker run -it my-image bash to get to the shell # Print the string hello echo "hello" # hello echo $? # 0 # Run a non existant command hello $(hello) # bash: hello: command not found echo $? # 127

Anda dapat terus menjalankan langkah-langkah ini, mengomentari Dockerfile Anda, masuk ke shell, dan mencari tahu perintah yang bermasalah, sampai gambar Docker Anda dibangun dengan sempurna.

Bungkus

Mudah-mudahan saya telah menunjukkan kepada Anda bahwa menggunakan image Docker tidak berbeda dengan terminal di komputer Anda. Menggunakan gambar Docker adalah cara luar biasa untuk mendistribusikan aplikasi.

Cobalah untuk mengambil aplikasi CLI favorit Anda atau proyek GitHub berikutnya, dan alih-alih membuat skrip penginstalan, paketkan dengan Docker. ;-)