Контейнер Docker постоянно регистрирует Enter Key на терминале - PullRequest
2 голосов
/ 12 апреля 2019

Я создаю образ с помощью Dockerfile.Я вытаскиваю последние образы Ubuntu и golang.

После импорта всех каталогов и сборки исполняемого файла с помощью go build внутри образа я хочу запустить исполняемый файл.По этой причине я попытался использовать ENTRYPOINT или CMD, чтобы исполняемый файл запускался при запуске контейнера.

Проблема заключается в том, что когда я делаю это, я запускаю контейнер в подключенном илив автономном режиме он постоянно регистрирует Enter Key постоянно (и загрузка процессора сходит с ума).Я могу понять это, потому что мой сценарий ожидает, пока ключ будет зарегистрирован, а затем завершен ввод данных, но, поскольку ключ Enter регистрируется немедленно снова, он печатает сообщение, и затем тот же цикл повторяется.

КогдаЯ строю свой образ, не выполняя (без CMD или ENTRYPOINT) двоичный файл, затем запускаю контейнер (двоичный файл все еще встроен в образ) с помощью терминала bash, и я выполняю двоичный файл, и все идет нормально, как и должно, без какой-либо Enter Key регистрации все время.

Любые идеи, почему это может происходить ???

Краткое описание моего Dockerfile:

# Import Images
FROM ubuntu:18.04
FROM golang:1.10

# Open ports
EXPORT ...

# Copy dependencies to GOPATH in docker file
COPY github.com/user/dependencies /go/src/github.com/user/dependencies
...

# Set working directory and build executable
WORKDIR /go/src/github.com/user/app-folder
RUN go build

# Run the binary (or not)
CMD ["app_name"]
-----OR-----
CMD ["./app_name"]
-----OR-----
ENTRYPOINT app_name
-----OR-----
ENTRYPOINT /go/src/github.com/user/app-folder/app_name

ВВ конце концов, я попробовал все это, по одному, я просто включил их для показа.Результат всегда был одинаковым.Результат в терминале:

...
Are you sure you want to exit? y/n
running. press enter to stop.

Are you sure you want to exit? y/n
running. press enter to stop.
...

Сценарий go выглядит следующим образом:

// running flag is set to True and then it scans for a newline
    for running {
        fmt.Println("running. press enter to stop.")
        fmt.Scanln()
        fmt.Println("Are you sure you want to exit? y/n")
        if models.ConfirmUserAction() {
            running = false
            close(models.DbBuffer)
        }
    }

и пакет моделей, который включает в себя функцию ConfirmUserAction:

//ConfirmUserAction waits (blocks) for user input, returns true if input was Y/y, else false.
func ConfirmUserAction() bool {
    var confirm string
    fmt.Scanln(&confirm)
    if confirm == "y" || confirm == "Y" {
        return true
    }

    return false
}

1 Ответ

0 голосов
/ 29 мая 2019

Я нашел способ обойти эту проблему, создав сценарий оболочки внутри контейнера, который затем запускает исполняемый файл (возможно, немного хакерский, но клавиша ввода больше не регистрируется все время).

Итак, теперь вместо запуска исполняемого файла на ENTRYPOINT в моем Dockerfile, я запускаю сценарий оболочки на ENTRYPOINT, который просто включает в себя что-то вроде этого:

#! /bin/sh
sleep 1;

echo "Starting Metrics Server..."
./metrics_server

metrics_server - это мойскомпилированный исполняемый файл, и я устанавливаю рабочий каталог WORKDIR, внутри моего Dockerfile должны быть исполняемый файл и сценарий оболочки.

Стоит упомянуть об этом, что я уже импортировал образ Ubuntu в свойDockerfile (FROM ubuntu:18.04), в любом случае мне это нужно.Я говорю это, потому что без него это может не сработать (не совсем уверен, я не пробовал).

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