Docker Ubuntu Openssh server - я понял, как заставить его не выходить, но я не понимаю, что происходит

Я создал 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)

Спасибо!

0
задан 17 January 2019 в 10:02

1 ответ

Давайте разберем это:

  1. Вы работаете с Dockerfile
  2. Вы используете инструкцию CMD
  3. Сначала давайте прочитаем https://docs .docker.com/engine/reference/builder/#cmd
  4. Глядя на формат использования вами CMD, docker называет его формой «оболочки»
  5. «Если вы используете форму оболочки CMD, затем он будет выполняться в /bin/sh -c" - что говорит вам, что все, что вы указали, будет интерпретировано /bin/sh 2.4 В linux, прочитав справочную страницу для sh: $ man sh и выполнив поиск exec, вы найдете:
 exec [command arg ...]
Если команда не опущена, процесс оболочки заменяется указанной программой (которая должна быть реальной программой, а не оболочкой).

встроенная функция или функция). Любые перенаправления на exec команды помечаются как постоянные, чтобы их нельзя было отменить после завершения команды exec.

Неясно, как это влияет на контейнер. Чтобы помочь с этим, см. ответы на этот вопрос: https://stackoverflow.com/q/32255814/831750

  1. Поскольку вы указали параметр для exec, например, "$@", он будет интерпретирован exec как часть «команды». Итак, что такое "$@"
  2. Простой поиск в Google по запросу: "$@", который, скорее всего, даст вам такой результат, как https://stackoverflow.com/questions/9994295/what-does-mean- in-a-shell-script/9995322, в котором объясняется, что

$@ — это все параметры, передаваемые сценарию

  1. Или из справочных страниц в разделе «Специальные параметры», с подраздел на @
 @ Раскрывается до позиционных параметров, начиная с единицы. Когда расширение происходит внутри двойных кавычек, каждый позиционный параметр раскрывается как отдельный аргумент. Если там
не являются позиционными параметрами, расширение @ генерирует нулевые аргументы, даже если @ заключен в двойные кавычки. В основном это означает, например, что если $1 — это «abc», а $2 — это
 «def ghi», затем «$@» расширяется до двух аргументов:
 "abc" "def ghi"

Я надеюсь, что это не только даст вам ответ на вопрос "$@", но и в какой-то степени покажет вам, как разобраться с подобным вопросом для себя. Получайте удовольствие :-D

0
ответ дан 28 November 2020 в 20:55

Другие вопросы по тегам:

Похожие вопросы: