Я создаю образ с помощью 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
}