各ドッカーコンテナは1つのシェルのみを直接提供しますか?

各ドッカーコンテナは1つのシェルのみを直接提供しますか?

各ドッカーコンテナは1つのシェルのみを直接提供しますか?

Pythonの画像があります:

$ sudo docker image list
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              2.7-slim            48e3247f2a19        10 days ago         120MB

私はもともとそれが私にPythonを見せることだと思いました。

しかし、コンテナからPythonコマンドを直接実行することはできません。

$ sudo docker run 48e3 print("hello")
bash: syntax error near unexpected token `('

シェルと同様に、コンテナから直接コマンドを実行できます。

$ sudo docker run 48e3 ls
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
$ sudo docker run 48e3 python --version
Python 2.7.16

答え1

コンテナのパフォーマンスは構築方法によって異なります。ビルダーにおよびオプションがある場合Dockerfileがあります。CMDENTRYPOINT

たとえば、これは決して呼び出されないコンテナです/bin/sh

まず、プログラムを実行する必要があります。goお見せしやすいので書いてみました。

$ cat small.go 
package main

import "fmt"
import "os"

func main() {
  fmt.Println("Hello")
  fmt.Print("You entered ")
  fmt.Println(os.Args[1:])
}

$ go build small.go

これで、コンテナ構築のガイドラインは次のとおりです。

$ cat Dockerfile 
FROM scratch
ADD small /
ENTRYPOINT ["/small"]

$ docker build -t small .
Sending build context to Docker daemon  1.642MB
Step 1/3 : FROM scratch
 ---> 
Step 2/3 : ADD small /
 ---> Using cache
 ---> 6171cecbf91b
Step 3/3 : ENTRYPOINT ["/small"]
 ---> Using cache
 ---> 14af8187a035
Successfully built 14af8187a035
Successfully tagged small:latest

次にコンテナを実行します。

$ docker run --rm small some options passed
Hello
You entered [some options passed]

実際、このコンテナには1つのプログラムしか含まれていませんが、small他には何も含まれていません!シェルもなく、ライブラリもなく、何もありません。

pythonこれで正しく実行して引数を渡さないと、表示しているドッカーイメージが次の状態になります。

$ docker run --rm -it python:2.7-slim
Python 2.7.16 (default, Mar 27 2019, 09:57:44) 
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

画像を調べてみるとわかります。

$ docker inspect python:2.7-slim
...
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"python2\"]"
            ],

CMDその後、のオプションを使用して構築されたものを見ることができますDockerfile。これが言う基本他のコマンドが呼び出しに転送されなかった場合にdocker run実行するコマンド。

したがって、このコンテナの場合は、python他のものを実行するように指示がなければ実行されます。

これは、次のような興味深いことができることを意味します。

$ echo 'print("hello")' | docker run --rm -i python:2.7-slim
hello

関連情報