Точка входа в 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"]