각 도커 컨테이너는 하나의 셸만 직접 제공합니까?
파이썬 이미지가 있습니다:
$ 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]
실제로 이 컨테이너에는 프로그램 하나만 포함되어 있으며 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