Точка входа в Docker и cmd вместе

Я пытаюсь настроить Docker с точкой входа и cmd.

FROM debian:stretch
RUN apt-get update && \
apt install gnupg ca-certificates -y 
RUN echo "deb http://repo.aptly.info/ squeeze main" > /etc/apt/sources.list.d/aptly.list
RUN apt-key adv --keyserver keys.gnupg.net --recv-keys 9E3E53F19C7DE460
RUN apt update && apt install aptly -y
ADD aptly.conf /etc/aptly.conf
ADD start.sh .
VOLUME ["/aptly"]
ENTRYPOINT ["/start.sh"]
CMD ["aptly", "api", "serve"]

Но сценарий входа не останавливается... Команда cmd не запускается

Вот мой сценарий:

#!/bin/bash
 set -e 
 init_aptly() { 
 #import pgp key
#create nginx root folder in /aptly
su -c "mkdir -p /aptly/.aptly/public"
echo "12"
 #initialize repository
 #aptly create repo doze-server -   distribution="stable"
  }
  #check for first run
 if [ ! -e /aptly/.aptly/public ]; then
  init_aptly
  echo "13"
 fi
  echo "14"

Сценарий всегда эхо 14, я хотел бы только один, а затем выполнить команду cmd из dockerfile

4 ответа

Решение

Когда вы используете и точку входа, и команду, командный раздел будет добавлен к исполняемой точке входа в качестве аргументов. Таким образом, в вашем случае:

ENTRYPOINT ["/start.sh"]
CMD ["aptly", "api", "serve"]

Это эквивалентно бегу:

ENTRYPOINT["/start.sh", "aptly", "api", "serve"]

Одно важное замечание, поскольку никто другой не упомянул об этом: чтобы использовать ENTRYPOINTи вместе, вам нужно указать оба в формате массива. Делать что-то вроде этого НЕ РАБОТАЕТ :

      ENTRYPOINT ./my_script.sh
CMD echo "hello world"

В приведенном выше коде ./my_script.shбудет называться, но CMDне будет пройдено.

Многое не могу сказать, не зная, что делает точка входа, но по сути это то, что вы делаете, комбинируя точки входа и cmd вместе:

/start.sh aptly api serve

Если вы просто запустили свой сервер, вы можете просто сделать что-то вроде этого (действительный путь к aptly исполняемый файл может быть необходим):

ENTRYPOINT ["aptly"]
CMD ["api", "serve"]

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

Следующее позволит заменить аргументы точки входа по умолчанию (предоставленные в CMD) аргументами, предоставленными в .

      ENTRYPOINT ["/start.sh"]
CMD ["aptly", "api", "serve"]

Далее будут добавлены аргументы, предоставленные вdocker runк точке входа после последнего аргумента. Чтобы сразу переопределить точку входа и ее аргументы, вам нужно будет явно использовать--entrypointфлаг:

      ENTRYPOINT["/start.sh", "aptly", "api", "serve"]
Другие вопросы по тегам