точка входа: 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"?


person overexchange    schedule 17.10.2019    source источник


Ответы (3)


entrypoint: "entrypoint.sh" переопределяет ENTRYPOINT ["test.sh"] из Dockerfile.

Из документов:

Установка точки входа переопределяет любую точку входа по умолчанию, установленную в образе службы с помощью инструкции ENTRYPOINT Dockerfile, и удаляет любую команду по умолчанию в образе — это означает, что если в файле Docker есть инструкция 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.

person rok    schedule 17.10.2019
comment
Единственное, что меня смущает, это то, что в моей рабочей области нет такого файла с именем entrypoint.sh. тогда как переопределение? - person Adiii; 17.10.2019
comment
@Adiii есть entrypoint.sh в базовом образе докера FROM todobackendbase. Базовый образ Docker копирует entrypoint.sh в папку /usr/local/bin - person overexchange; 18.10.2019

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?

person Tomas Bruckner    schedule 17.10.2019

Обновление: если в базовом образе есть 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. $@ — это переменная оболочки, которая означает «все аргументы»,

use-a-script-to-initialize- данные-контейнера с состоянием

cmd-vs-entrypoint

person Adiii    schedule 17.10.2019
comment
Относится к docker-compose stackoverflow.com/questions/58439706/ - person overexchange; 17.10.2019