точка входа: "entrypoint.sh" - докер создает
По названию такого файла нет entrypoint.sh
в моем рабочем пространстве.
Но ниже инструкции в docker-compose.yml
ссылается на это:
builder:
build: ../../
dockerfile: docker/dev/Dockerfile
volumes:
- ../../target:/wheelhouse
volumes_from:
- cache
entrypoint: "entrypoint.sh"
command: ["pip", "wheel", "--non-index", "-f /build", "."]
где ../docker/dev/Dockerfile
имеет
# Set defaults for entrypoint and command string
ENTRYPOINT ["test.sh"]
CMD ["python", "manage.py", "test", "--noinput"]
Что значит entrypoint: "entrypoint.sh"
на самом деле делать?
3 ответа
entrypoint: "entrypoint.sh"
отменяет ENTRYPOINT ["test.sh"]
из Dockerfile.
Из документов:
Установка точки входа переопределяет любую точку входа по умолчанию, установленную в образе службы с помощью инструкции ENTRYPOINT Dockerfile, и очищает любую команду по умолчанию в образе - это означает, что если в Dockerfile есть инструкция CMD, она игнорируется.
ENTRYPOINT ["test.sh"]
установлен в Dockerfile, описывающем образ докераentrypoint: "entrypoint.sh"
устанавливается в файле docker-compose, который описывает среду многоконтейнеров со ссылкой на файл Dockerfile.docker-compose build builder
создаст образ и установит точку входа наENTRYPOINT ["test.sh"]
установлен в Dockerfile.docker-compose up builder
запустит контейнер с точкой входаentrypoint.sh pip wheel --no-index '-f /build' .
установить в файле docker-compose
ENTRYPOINT
- это команда или сценарий, который выполняется при запуске контейнера докеров.
Если вы укажете entrypoint
в docker-compose.yaml
, это отменяет ENTRYPOINT
из указанного Dockerfile
.
CMD
это то, что передается как параметры в ENTRYPOINT
Итак, если вы просто запустите dev/Dockerfile
, он выполнит
test.sh python manage.py test --noinput
Если вы переопределили CMD
в docker-compose.yaml
как и вы, он выполнит
test.sh pip wheel --non-index -f /build .
Но потому что вы также отказались ENTRYPOINT
в вашем docker-compose.yaml
, он будет выполнять
entrypoint.sh pip wheel --non-index -f /build .
Итак, в основном, entrypoint.sh
это скрипт, который будет работать внутри вашего контейнера builder
когда вы выполняете docker-compose up
команда.
Также вы можете проверить этот ответ для получения дополнительной информации. В чем разница между CMD и ENTRYPOINT в Dockerfile?
Обновление:
если в базовом образе естьentrypoint.sh
, он выполнит это, но если вы переопределите свою собственную точку входа, контейнер запустит переопределенную точку входа.
Если вы хотите переопределить поведение базового образа по умолчанию, вы можете изменить его, в противном случае вам не нужно переопределять его из docker-compose.
Что на самом деле делает точка входа: "entrypoint.sh"?
Это полностью зависит от сценария или команды внутри entrypoint.sh, но мало что можно учесть.
Инструкция ENTRYPOINT позволяет вам настроить контейнер, который будет работать как исполняемый файл. Он похож на CMD, потому что также позволяет указывать команду с параметрами. Разница в том, что команда ENTRYPOINT и параметры не игнорируются, когда контейнер Docker запускается с параметрами командной строки. (Есть способ игнорировать ENTTRYPOINT, но вряд ли вы это сделаете.)
Проще говоря, точка входа может быть сложным сценарием bash, например, в случае точки входа mysql, которая превышает 200 LOC, которая выполняет следующую задачу.
- запустить сервер MySQL
- подождите, пока сервер MySQL загрузится
- Создать БД
- Может выполнять миграцию БД или инициализацию БД
С CMD невозможно выполнить такую сложную задачу, поскольку в CMD вы можете запустить bash, но заставить его работать будет больше головной боли. Кроме того, это упрощает Dockerfile и ставит сложную задачу на точку входа.
Когда есть точка входа, все, что передается в CMD, будет рассматриваться как аргумент для точки входа.
В вашем случае CMD - это CMD ["python", "manage.py", "test", "--noinput"]
он будет передан в качестве аргумента, и лучше всего использовать
# set of command
#start long running process at the end that is passed from CMD
exec "$@"
Наконец, вызывается конструкция оболочки exec, так что последняя заданная команда становится PID 1 контейнера.
$@
переменная оболочки, означающая "все аргументы",
использовать-скрипт-для-инициализации-данных-контейнера-состояния