各ドッカーコンテナは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
があります。CMD
ENTRYPOINT
たとえば、これは決して呼び出されないコンテナです/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