Dockerfile с точкой входа только из базового образа

У меня очень простой Dockerfile, как показано ниже: -

FROM my-base-image
COPY abc.properties /opt/conf/

Теперь у моего базового образа есть точка входа в докер (в конце его файла Docker), но в этом результирующем образе, как вы можете видеть, ее нет. Работает ли это, или нам нужна точка входа / CMD для докеров в любом заданном файле Docker. Также, каков будет порядок выполнения инструкции COPY в результирующем изображении. Под этим я подразумеваю, поскольку этот Dockerfile не имеет точки входа, он будет выполнять одну из базового образа, но это будет выполняться после инструкции COPY, или сначала будет выполнена точка входа базового образа, а затем будет выполнена эта инструкция COPY при запуске контейнера. Просто ищите концепции. в докере.


person Ashley    schedule 26.11.2019    source источник
comment
Он должен унаследовать его от базы; у вас должна быть возможность просто запустить получившееся изображение и узнать. Я не уверен, каков ваш вопрос о порядке выполнения, вещи в Dockerfile обычно происходят последовательно.   -  person David Maze    schedule 26.11.2019
comment
Конечно, Дэвид. Итак, я имел в виду, поскольку базовое изображение будет извлечено первым, поэтому его точка входа будет выполнена (точка входа в конце этого базового изображения), как он затем выполнит инструкцию COPY. просто любопытно   -  person Ashley    schedule 26.11.2019


Ответы (2)


Некоторые директивы Dockerfile (особенно ENTRYPOINT и CMD, но также EXPOSE, LABEL и MAINTAINER) просто устанавливают метаданные в образ; Сами они на самом деле ничего не делают. В пределах одного Dockerfile это будет работать нормально:

FROM ubuntu:18.04
WORKDIR /app
# Just remembers this in the image metadata; doesn't actually run it
CMD ["/app/main.sh"]
# ...we should actually copy the file in too
COPY main.sh /app

Когда у вас есть один Dockerfile, созданный из другого образа, он действует почти так же, как вы выполнили все команды в первом Dockerfile, а затем все команды во втором Dockerfile. Поскольку CMD и ENTRYPOINT просто устанавливают метаданные, второе изображение наследует эти метаданные.

Создание и запуск образа - это два отдельных шага. В показанном вами примере директива COPY выполняется на шаге docker build, а команда базового образа не вступает в силу до следующего шага docker run. (Это также верно в Docker Compose; часто возникает вопрос, почему шаги Dockerfile не могут подключаться к другим контейнерам, объявленным в файле Compose YAML.)

Есть одно исключение, и оно около ENTRYPOINT. Если у вас есть базовый образ, объявляющий как ENTRYPOINT, так и CMD, и вы повторно объявляете ENTRYPOINT в производном образе, также сбрасывает CMD (самый последний абзац в этом разделе). Обычно это не практическая проблема.

person David Maze    schedule 27.11.2019

Когда вы создаете образ, Dockerfiles объединяются в соответствии с их инструкциями. Создание образа не означает, что он запускается. Поэтому в идеале ваши инструкции из базового файла Dockerfile и текущего файла Dockerfile будут упакованы. Поскольку вы упомянули точку входа CMD в базовом файле Dockerfile, она будет использоваться для выполнения вашего образа внутри контейнера, когда вы используете docker run.
Итак, когда вы создаете образ, оператор COPY из вашего дочернего файла Dockerfile также будет установлен. . и ваш имидж должен быть построен нормально. Выполните свои docker build и docker run и сообщите нам

person Srini M    schedule 27.11.2019