Как вызвать неинтерактивно docker -компонентную команду запуска - S SH? - PullRequest
1 голос
/ 25 февраля 2020

Описание ситуации: у меня есть виртуальная машина Ubuntu, работающая на удаленном компьютере B. Я могу получить доступ к этому компьютеру B через S SH, запущенный на моем хосте (компьютере A). Когда я вхожу в интерактивную оболочку через S SH на компьютере B, я могу без проблем выполнить все свои команды docker, выполнив следующие шаги:

  • ssh user@remote_IP (вводится интерактивно в удаленная оболочка)
  • docker-compose run -d --name wfirst --user 1000:1000 container (создайте контейнер docker и запустите его)

Это отлично работает, мой контейнер смонтирован, запущен и работает. Однако, если я попытаюсь выполнить эту команду неинтерактивным способом, написав в моем терминале:

  • ssh user@remoteIP "cd /path_to_docker_file;docker-compose run -d --name wfirst --user 1000:1000 container"

Команда не будет выполнена успешно, моя Контейнер не установлен и не работает. Я смог получить больше информации, используя флаг "--verbose" в команде docker -compose.

Вот интересная часть вывода успешного метода:

    compose.config.config.find: Using configuration files: ./docker-compose.yml
    WARNING: compose.config.environment.__getitem__: The DISPLAY variable is not set. Defaulting to a blank string.
    WARNING: compose.config.environment.__getitem__: The NO_PROXY variable is not set. Defaulting to a blank string.
    docker.utils.config.find_config_file: Trying paths: ['/home/user/.docker/config.json', '/home/user/.dockercfg']
    docker.utils.config.find_config_file: No config file found
    docker.utils.config.find_config_file: Trying paths: ['/home/user/.docker/config.json', '/home/user/.dockercfg']
    docker.utils.config.find_config_file: No config file found
    urllib3.connectionpool._new_conn: Starting new HTTP connection (1): localhost:2375
    urllib3.connectionpool._make_request: http://localhost:2375 "GET /v1.25/version HTTP/1.1" 200 758
    compose.cli.command.get_client: docker-compose version 1.21.0, build unknown
    docker-py version: 3.4.1
    CPython version: 3.7.5
    OpenSSL version: OpenSSL 1.1.1c  28 May 2019
    compose.cli.command.get_client: Docker base_url: http://localhost:2375
    ...

Мы видим, что HTTP-соединение с docker успешно установлено. Затем команда продолжает свое выполнение и может создать контейнер из docker образа.

Вот вывод метода сбоя:

    compose.config.config.find: Using configuration files: ./docker-compose.yml
    compose.config.environment.__getitem__: The DISPLAY variable is not set. Defaulting to a blank string.
    compose.config.environment.__getitem__: The NO_PROXY variable is not set. Defaulting to a blank string.
    docker.utils.config.find_config_file: Trying paths: ['/home/user/.docker/config.json', '/home/user/.dockercfg']
    docker.utils.config.find_config_file: No config file found
    docker.utils.config.find_config_file: Trying paths: ['/home/user/.docker/config.json', '/home/user/.dockercfg']
    docker.utils.config.find_config_file: No config file found
    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 384, in _make_request
        six.raise_from(e, None)
      File "<string>", line 3, in raise_from
      File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 380, in _make_request
        httplib_response = conn.getresponse()
      File "/usr/lib/python3.7/http/client.py", line 1344, in getresponse
        response.begin()
      File "/usr/lib/python3.7/http/client.py", line 306, in begin
        version, status, reason = self._read_status()
      File "/usr/lib/python3.7/http/client.py", line 267, in _read_status
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
      File "/usr/lib/python3.7/socket.py", line 589, in readinto
        return self._sock.recv_into(b)
    socket.timeout: timed out

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/requests/adapters.py", line 449, in send
        timeout=timeout
      File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 638, in urlopen
        _stacktrace=sys.exc_info()[2])
      File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 367, in increment
        raise six.reraise(type(error), error, _stacktrace)
      File "/usr/lib/python3/dist-packages/six.py", line 693, in reraise
        raise value
      File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 600, in urlopen
        chunked=chunked)
      File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 386, in _make_request
        self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
      File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 306, in _raise_timeout
        raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
    urllib3.exceptions.ReadTimeoutError: UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "/usr/bin/docker-compose", line 11, in <module>
        load_entry_point('docker-compose==1.21.0', 'console_scripts', 'docker-compose')()
      File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 71, in main
        command()
      File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 124, in perform_command
        project = project_from_options('.', options)
      File "/usr/lib/python3/dist-packages/compose/cli/command.py", line 41, in project_from_options
        compatibility=options.get('--compatibility'),
      File "/usr/lib/python3/dist-packages/compose/cli/command.py", line 121, in get_project
        host=host, environment=environment
      File "/usr/lib/python3/dist-packages/compose/cli/command.py", line 95, in get_client
        version_info = six.iteritems(client.version())
      File "/usr/lib/python3/dist-packages/docker/api/daemon.py", line 181, in version
        return self._result(self._get(url), json=True)
      File "/usr/lib/python3/dist-packages/docker/utils/decorators.py", line 46, in inner
        return f(self, *args, **kwargs)
      File "/usr/lib/python3/dist-packages/docker/api/client.py", line 198, in _get
        return self.get(url, **self._set_request_timeout(kwargs))
      File "/usr/lib/python3/dist-packages/requests/sessions.py", line 546, in get
        return self.request('GET', url, **kwargs)
      File "/usr/lib/python3/dist-packages/requests/sessions.py", line 533, in request
        resp = self.send(prep, **send_kwargs)
      File "/usr/lib/python3/dist-packages/requests/sessions.py", line 646, in send
        r = adapter.send(request, **kwargs)
      File "/usr/lib/python3/dist-packages/requests/adapters.py", line 529, in send
        raise ReadTimeout(e, request=request)
    requests.exceptions.ReadTimeout: UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)

Мы видим, что соединение HTTP не может быть установлено.

Почему я должен отправлять свои команды неинтерактивным способом? Первоначально я хочу отправить эти команды с помощью Jenkins (я добавил плагин S SH в Jenkins), и я заметил, что команды docker не работали (такой же вывод, как показано в этом посте). После нескольких тестов я понял, что когда Дженкинс использует S SH, он отправляет команды неинтерактивным способом: - ssh user@remote_IP "commands_to_execute"

Этот неинтерактивный способ не является проблемой для простых команд Но, похоже, это проблема для некоторых docker команд, которые нужно выполнять в интерактивной оболочке? Кто-нибудь нашел обходной путь для успешного выполнения docker команд в неинтерактивной оболочке? Буду очень признателен за любую помощь, подсказку или альтернативные решения, так как я много чего пробовал безуспешно.

1 Ответ

2 голосов
/ 25 февраля 2020

Вы проверили, работает ли docker - по tcp или по unix сокету?

Возможно, вы не читаете правильные переменные окружения, когда вы входите через s sh u @ h " команда».

Если он работает на сокете unix (по умолчанию), попробуйте ...

s sh user @ remoteIP "cd / path_to_docker_file; DOCKER_HOST = unix: /// var /run/docker.sock docker -compose run -d --name wfirst --user 1000: 1000 контейнер "

или, если запущен по TCP, вы можете попробовать ...

s sh user @ remoteIP "cd /path_to_docker_file;DOCKER_HOST=tcp://127.0.0.1:2375 docker -compose run -d --name wfirst --user 1000: контейнер 1000"

...