Я создал Dockerfile с установками для ssh-server, и изначально у меня были проблемы с его выходом сразу после команды на запуск службы. Я нашел обходной путь, но я не понимаю, что именно делает часть, которая держит его открытым.
Вот Dockerfile:
#To make an image from this: docker build -t [image name] .
#On host, ufw allow [some other port than 22]
#Run container: docker run --rm [image_name] -p [other port from above]:22
FROM ubuntu:latest
#add a user
RUN useradd -s /bin/bash [some username]
#give her sudo privileges
RUN adduser [some username] sudo
RUN echo [some username]:[some password] | chpasswd
#install openssh server
RUN apt-get update && apt-get install -y openssh-server
#create needed directory for ssh-server
RUN mkdir -p /var/run/sshd
#start ssh server
CMD exec "$@" && /usr/sbin/ssh -D
# Expose the SSH port
EXPOSE 22
У меня есть вопрос, касающийся оператора CMD, и особенно "exec" $ @ "". Почему это поддерживает работу контейнера и что именно он делает, чего не делает сервер ssh, когда он предоставляет интерфейс для командной строки сервера?
Дополнительная информация (не уверен, актуально ли это, но для тех, кому интересно, Хост Docker работает под управлением Ubuntu 18.04.10 LTS, Docker - это Docker-ce)
Спасибо!
Давайте разберем это:
$ man sh
и выполнив поиск exec, вы найдете: exec [command arg ...] Если команда не опущена, процесс оболочки заменяется указанной программой (которая должна быть реальной программой, а не оболочкой).
встроенная функция или функция). Любые перенаправления на exec команды помечаются как постоянные, чтобы их нельзя было отменить после завершения команды exec.
Неясно, как это влияет на контейнер. Чтобы помочь с этим, см. ответы на этот вопрос: https://stackoverflow.com/q/32255814/831750
$@ — это все параметры, передаваемые сценарию
@ Раскрывается до позиционных параметров, начиная с единицы. Когда расширение происходит внутри двойных кавычек, каждый позиционный параметр раскрывается как отдельный аргумент. Если там не являются позиционными параметрами, расширение @ генерирует нулевые аргументы, даже если @ заключен в двойные кавычки. В основном это означает, например, что если $1 — это «abc», а $2 — это «def ghi», затем «$@» расширяется до двух аргументов: "abc" "def ghi"
Я надеюсь, что это не только даст вам ответ на вопрос "$@", но и в какой-то степени покажет вам, как разобраться с подобным вопросом для себя. Получайте удовольствие :-D