То, как выполняется контейнер, зависит от того, как он был создан. В билдере 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
Сетевой менеджер предназначен для управления сетями, он имеет логику для переключения сетей в зависимости от их доступности. когда вы запускаете первый сценарий и удаляете его, демон сетевого менеджера, вероятно, замечает и подключается к тому, что доступно по умолчанию.
Во-вторых, вы перемещаете файлы, которые сообщают сетевому менеджеру, к каким точкам доступа Wi-Fi он должен подключаться. Поэтому, когда у него есть домашний файл, он сможет подключиться только к дому, потому что это единственная сеть, о которой он знает. Когда у него есть файл iot, он сможет подключиться только к iot.
Он не переключится, потому что диспетчер сети не знает о существовании другого. Лучший способ решить вашу проблему — установить приоритет для SSID в диспетчере сети или использовать «nmcli device wifi connect», который должен работать для подключения к другому SSID без его отключения. Если не эта команда, справочные страницы nmcli должны быть полезны, чтобы выяснить, как это сделать.