각 도커 컨테이너는 하나의 쉘만 직접 제공합니까?

각 도커 컨테이너는 하나의 쉘만 직접 제공합니까?

각 도커 컨테이너는 하나의 셸만 직접 제공합니까?

파이썬 이미지가 있습니다:

$ 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]

실제로 이 컨테이너에는 프로그램 하나만 포함되어 있으며 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

관련 정보