Docker Ubuntu Openssh server - я разобрался, как заставить его не выходить, но я не понимаю, что происходит
Я сделал Dockerfile с установками для ssh-сервера, и у меня изначально были проблемы с выходом сразу после команды запуска службы. Я нашел обходной путь, но я не понимаю, что именно делает часть, которая держит его открытой.
Вот 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)
Спасибо!
0 ответов
Давайте разберем это:
- Вы работаете с Dockerfile
- Вы используете инструкцию CMD
- Сначала давайте прочитаем https://docs.docker.com/engine/reference/builder/#cmd
- Глядя на формат использования CMD, докер называет это формой оболочки.
- "Если вы используете оболочку CMD, то команда будет выполняться в /bin/sh -c", что означает, что все, что вы указали, будет интерпретироваться /bin/sh
2.4. В linux при чтении страницы руководства для sh:
$ man sh
и при поиске exec вы найдете:
exec [command arg ...] Unless command is omitted, the shell process is replaced with the specified program (which must be a real program, not a shell
встроенная функция или функция). Любые перенаправления в команде exec помечаются как постоянные, поэтому они не отменяются после завершения команды exec.
Что здесь не ясно, так это то, как это влияет на контейнер. Чтобы помочь с этим, см. Ответы на этот вопрос: https://stackoverflow.com/q/32255814/831750
- Поскольку вы указали параметр для exec, например, "$@", он будет интерпретирован exec как часть "команды". Итак, что такое "$ @"
- Простой поиск в Google по запросу "$@", который, скорее всего, даст вам результат, например https://stackoverflow.com/questions/9994295/what-does-mean-in-a-shell-script/9995322, в котором это объяснил, что
$@ - это все параметры, переданные в скрипт
- Или на страницах руководства в разделе "Специальные параметры" с подразделом на @
@ Expands to the positional parameters, starting from one. When the expansion occurs within double-quotes, each positional parameter expands as a separate argument. If there are no positional parameters, the expansion of @ generates zero arguments, even when @ is double-quoted. What this basically means, for example, is if $1 is “abc” and $2 is “def ghi”, then "$@" expands to the two arguments: "abc" "def ghi"
Я надеюсь, что это не только даст вам ответ на вопрос "$@", но и отчасти покажет вам, как разбираться в подобном вопросе для себя. Удачи:-D