Почему docker -состав не работает в интерактивном режиме? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть этот docker -компонентный файл:

version: "2"

services: 
    test:
        image: python:3
        stdin_open: true
        tty: true
        container_name: test_c

Если я просто запускаю docker -составить, он не работает

$ sudo docker-compose up 
Recreating test_c
Attaching to test_c
test_c  | Python 3.8.2 (default, Feb 26 2020, 14:58:38) 
test_c  | [GCC 8.3.0] on linux
test_c  | Type "help", "copyright", "credits" or "license" for more information.
^CGracefully stopping... (press Ctrl+C again to force)
Stopping test_c ... 
Killing test_c ... done

Я могу обойти это делается:

$ sudo docker-compose up -d
$ sudo docker attach test_c
>>> 

Но я хочу знать, почему не работает просто с docker -составить.

1 Ответ

0 голосов
/ 28 марта 2020

Здесь происходит то, что вы порождаете экземпляр Python, а затем не предоставляете команде никаких аргументов. Docker контейнеры - это, по сути, абстракции вокруг файловых систем и ресурсов для отдельных процессов из ядра ОС хоста.

Итак, в этом случае вызываемый вами образ просто создается и затем звонит Python. Что произойдет, если вы позвоните Python в вашей оболочке на вашем компьютере? Он сбрасывает вас в интерактивную оболочку, в которую вы затем можете отправлять команды.

Ну, это не имеет особого смысла. Зачем вызывать команду, которая просто запускает оболочку в пространстве имен , которая не может общаться ни с чем другим? Реальный способ использования Docker заключается в передаче аргументов этому образу контейнера. Таким образом, когда Docker запускает процесс Python, он может передать ему аргумент , чтобы что-то сделать. Например, запустите приложение, которое было смонтировано или скопировано томом через Dockerfile.

Так как мы это сделаем? Ну, мы можем предоставить ваш docker -компонентный файл с некоторыми аргументами через поле Args !

Но, мне кажется, вы здесь просто играете. Таким образом, у вас, скорее всего, нет проекта для передачи на Python с полем args. Или вернуться в новое Docker изображение. То, что вы, вероятно, пытаетесь сделать, это попасть в оболочку Python.

Причина, по которой это не происходит автоматически, когда Docker запускает команду python, заключается в том, что docker-compose up или docker run не переводят вас в интерактивную среду. Он просто вызывает команду entrypoint в контейнере. Для этого вам необходимо вызвать ДОПОЛНИТЕЛЬНУЮ команду в контейнере. В этом случае оболочка. Большинство контейнерных ОС поставляются с установленным на них чем-то вроде sh или bash. Я сомневаюсь, что python делает. Однако вы можете проверить его, используя команду exe c следующим образом:

docker-compose up -d
docker exec -it test_c

Дайте мне знать, если вам нужна дополнительная информация или поддержка для этого вопроса. Всегда рады помочь вам начать с Docker. Это потрясающая технология!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...