точка входа: "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 контейнера. $@ переменная оболочки, означающая "все аргументы",

использовать-скрипт-для-инициализации-данных-контейнера-состояния

cmd-vs-точка входа

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