Как сохранить изображение httpd docker при выполнении скрипта - PullRequest
0 голосов
/ 28 апреля 2020

Я создал образ на основе httpd: 2.4, и он работал. Мне пришлось добавить скрипт, так как мне нужно выполнить какое-то действие с ENTRYPOINT, но теперь, когда контейнер запускается, он немедленно завершается.

В контейнере Nodes я запускаю индекс узла. js внутри скрипта, так что он остается живым пока здесь выходит. Я думаю, что это происходит, поскольку он выполняет скрипт, тогда для docker можно выйти (он не знает, что должен делать образ)

Вот мой док-файл, а затем запуск. sh

dockerfile

FROM httpd:2.4 

RUN \
  apt-get update \
  && apt-get -y install gettext-base \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

LABEL XXX

ENV FE_VERSION=1.0

# Create app directory
WORKDIR /usr/local/apache2/htdocs/xxx/

COPY . /usr/local/apache2/htdocs/xxx/
COPY ./docker/startup.sh .

#COPY .htaccess /usr/local/apache2/htdocs/xxx
COPY ./docker/my-httpd.conf /usr/local/apache2/conf/httpd.conf
COPY ./docker/httpd-vhosts.conf /usr/local/apache2/conf/httpd-vhosts.conf

RUN chmod -R 755 /usr/local/apache2/htdocs/

EXPOSE 80

ENTRYPOINT [ "/bin/sh", "startup.sh" ]

автозагрузка. sh

envsubst \$parameters_in_milliseconds,\$server,\$checkServerConnectionInterval,\$detailRefreshInterval,\$customMainPopupTimerInterval,\$customTimerSectionTimerInterval,\$machineParametersTimerInterval,\$workingTimeInterval,\$ioUnitResourcesInterval,\$loggedUsersInterval < ./params/params.json.empty > ./params/params.json

Есть предложения? Заранее спасибо

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Если ваш Dockerfile имеет ENTRYPOINT, это единственный процесс, выполняемый контейнером. Если он также имеет CMD, , он передается в качестве аргументов командной строки в точку входа.

Это стандартное использование ENTRYPOINT для первоначальной настройки, а затем запустить CMD. Для этого сценарий должен заканчиваться exec "$@", чтобы запустить команду, переданную в качестве аргументов.

#!/bin/sh
envsubst ...
exec "$@"

Если вы указали ENTRYPOINT в своем Dockerfile, вам также нужно указать CMD, даже если в базовом изображении определен CMD (см. «примечание» в ссылке выше). В декларации ENTRYPOINT должна использоваться форма JSON -array, иначе CMD потеряется.

Поэтому я бы немного изменил конец файла Docker на

RUN chmod +x startup.sh
ENTRYPOINT ["./startup.sh"]
CMD ["httpd-foreground"]

(Одна вещь, которую обычно хочется делать, особенно когда вы разрабатываете образ, - это копаться во встроенном:

docker run --rm myimage ls -l xxx
# why is index.html executable?

Этот подход выполняет первоначальную настройку, а затем запускает команду, Таким образом, вы увидите «настоящий» файл конфигурации. Если вы «запекаете» команду в сценарии точки входа, сложно запустить альтернативную команду.)

0 голосов
/ 28 апреля 2020

Если вы заменяете исходную точку входа своим собственным сценарием, и wi sh, чтобы сохранить те же функции, что и исходный, вам нужно добавить исходную команду в конец вашей точки входа.

Для Например, пользовательская точка входа для apache:

# entrypoint
#!/usr/bin/env bash
echo "===> Doing some important things and then starting the server"
httpd-foreground

, которая будет хорошо работать с этим Dockerfile:

# Dockerfile
FROM httpd:2.4
COPY entrypoint /usr/local/bin/entrypoint
RUN chmod +x /usr/local/bin/entrypoint
ENTRYPOINT ["entrypoint"]

См. оригинальный файл Docker и его EntryPoint .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...