Docker Exec - Cara Menjalankan Perintah di dalam Docker Image atau Container

Saya akan memberitahu anda mengenai rahsia DevOps di sini: Perkara yang suka dilakukan oleh orang-orang DevOpsy ialah membina sistem yang sangat mewah dan kompleks, kemudian cari jalan untuk menanganinya seperti shell biasa. Atau sambungkan dengannya dengan SSH dan kemudian perlakukan seperti cengkerang biasa.

Docker tidak berbeza! Anda menjalankan komputer di dalam komputer lain. Mungkin komputer itu adalah contoh EC2 atau komputer riba. Anda bahkan boleh menjadi sangat gila dan menjalankan VM yang kemudian menjalankan Docker.

Selalunya ketika saya menggunakan Docker, saya menggunakannya untuk mengemas dan menyebarkan aplikasi. Kadang kala saya menggunakannya untuk sesuatu yang lebih sejuk seperti projek pengkomputeran yang diedarkan. Tetapi banyak kali saya membuang Dockerfile di repo GitHub sehingga saya tidak perlu memasang CLI yang baru saya tahu akhirnya akan bertentangan di komputer riba saya.

Singkat cerita, anda boleh memberitahu Docker untuk menjalankan perintah bash, yang menjatuhkan anda ke cengkerang:

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

Tetapi teruskan membaca untuk lebih banyak lagi. ;-)

Cubalah

Google Docker up bahasa pengaturcaraan kegemaran anda. Bagi saya ini adalah Python, dan secara khusus saya suka konda. Kemudian jalankan beberapa arahan untuk memastikan bahawa anda sebenarnya berada di cangkang 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

Hebat, ya? Ini sangat sesuai untuk menyahpepijat bekas yang semestinya berfungsi dengan baik. Ia juga bagus untuk kes penggunaan "Saya tidak mahu memasangnya ke komputer saya" yang paling biasa.

Debug Docker Build dengan Docker Run

Memperlakukan gambar Docker anda seperti cengkerang biasa akan sangat berguna ketika cuba menyahpepijat binaan Docker.

Katakan anda mempunyai Dockerfile untuk imej yang anda cuba bina. Biasanya yang berlaku adalah ketika berjalan docker build -t my-image .(-t adalah untuk tag) Docker akan berjalan melalui setiap langkah RUN anda, dan berhenti ketika sampai ke perintah yang tidak keluar dengan baik.

Dalam shell UNIX, kod keluar 0 bermaksud semuanya baik dengan perintah. Jadi untuk menggambarkan perkara ini saya telah membuat Dockerfile kami mempunyai 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 kelihatan 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 boleh mengesahkan bahawa gambar Docker anda tidak dibina dengan menjalankan docker imagesdan memeriksa my-image. Tidak akan ada kerana ia tidak berjaya dibina.

Sekarang apa yang dapat kita lakukan adalah memberi komen mengenai perintah Dockerfile RUN yang menyusahkan.

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 ialah:

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 kini boleh memasukkan gambar Docker anda dan mula menjalankan perintah secara interaktif!

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

Dari sini, satu persatu, anda boleh mula menyahpepijat perintah RUN anda untuk melihat apa yang salah. Sekiranya anda tidak pasti sama ada arahan dikeluarkan dengan betul 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 boleh terus menjalankan langkah-langkah ini, mengomentari Dockerfile anda, jatuh ke cangkang, dan mencari perintah yang bermasalah, sehingga gambar Docker anda terbentuk dengan sempurna.

Kemaskan

Mudah-mudahan saya telah menunjukkan kepada anda bahawa menggunakan gambar Docker tidak berbeza dengan terminal di komputer anda. Menggunakan gambar Docker adalah kaedah hebat untuk menyebarkan aplikasi.

Cuba ambil aplikasi CLI kegemaran anda atau projek GitHub seterusnya, dan bukannya membuat skrip pemasangan, pasangkannya dengan Docker. ;-)