entrypoint: "entrypoint.sh" - создание докера - PullRequest
1 голос
/ 17 октября 2019

В моей рабочей области нет такого файла с именем 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 ]

1 голос
/ 17 октября 2019

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

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

Установка точки входа обе переопределяет любую точку входа по умолчанию, установленную на изображении службыс инструкцией ENTRYPOINT Dockerfile и очищает любую команду по умолчанию на изображении - это означает, что если в Dockerfile есть инструкция CMD, она игнорируется.

  • ENTRYPOINT ["test.sh"] isset в Dockerfile, описывающий образ docker

  • 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

1 голос
/ 17 октября 2019

ENTRYPOINT - это команда или сценарий, который выполняется при запуске контейнера Docker.

Если указать 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?

0 голосов
/ 17 октября 2019

Обновление: Если базовое изображение имеет entrypoint.sh, оно запустится, но если вы переопределите свою собственную точку входа, тогда контейнер запустит переопределенную точку входа.

Если вычтобы переопределить поведение базового образа по умолчанию, вы можете изменить его, в противном случае вам не нужно переопределять его из docker-compose.

Что на самом деле делает entrypoint: "entrypoint.sh"?

Это полностью зависит от сценария или команды в entrypoint.sh, но можно учесть несколько вещей.

Инструкция ENTRYPOINT позволяет настроить контейнер, который будет выполняться как исполняемый файл. Он похож на CMD, потому что он также позволяет указывать команду с параметрами. Разница заключается в команде ENTRYPOINT, и параметры не игнорируются, когда контейнер Docker работает с параметрами командной строки. (Существует способ игнорировать ENTTRYPOINT, но маловероятно, что вы это сделаете.)

Проще говоря, точкой входа может быть сложный сценарий bash, например, в случае mysql точка входа , что превышает 200 LOC и выполняет следующую задачу.

  • запустить сервер MySQL
  • дождаться, пока сервер MySQL не будет работать
  • Создать базу данных
  • Может выполнять миграцию БД или инициализацию БД.

С CMD такая сложная задача невозможна, так как в CMD вы можете запустить bash, но для его работы будет больше головной боли. Также это делает Dockerfile простым и помещает сложную задачу в точку входа.

Когда есть точка входа, все, что передается в CMD, будет рассматриваться как аргумент для точки входа.

В вашем случае, CMDCMD ["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-stateful-container-data

cmd-vs-entrypoint

...