Как расширить образ докера nginx без получения ошибки systemctl: команда не найдена? - PullRequest
1 голос
/ 17 октября 2019

Я хочу создать свой собственный настраиваемый образ докера из образа nginx.

Я переопределяю ENTRYPOINT для nginx своим собственным файлом ENTERYPOINT.

Что заставляет меня задать два вопроса:

  1. Я думаю, что при этом я теряю некоторые команды из nginx. я прав? (например, выставить порт ..)
  2. Если я хочу перезапустить nginx, я запускаю следующие команды: nginx -t && systemctl reload nginx. но вывод:

    nginx: configuration file /etc/nginx/nginx.conf test is successful

    /entrypoint.sh: line 5: systemctl: command not found

Как это исправить?

FROM nginx:latest

WORKDIR /

RUN echo "deb http://ftp.debian.org/debian stretch-backports main" >> /etc/apt/sources.list

RUN apt-get -y update && \
    apt-get -y install apt-utils && \
    apt-get -y upgrade && \
    apt-get -y clean

# I ALSO WANT TO INSTALL CERBOT FOR LATER USE (in my entrypoint file)

RUN apt-get -y install python-certbot-nginx -t stretch-backports

# COPY ./something ./tothisimage 
# COPY ./something ./tothisimage 
# COPY ./something ./tothisimage 
# COPY ./something ./tothisimage 

COPY entrypoint.sh /entrypoint.sh

ENTRYPOINT ["bash", "/entrypoint.sh"]

entrypoint.sh

echo "in entrypoint"

# I want to run some commands here... 

# After I want to run nginx normally....

nginx -t && systemctl reload nginx

echo "after reload"

Ответы [ 3 ]

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

Такие команды, как service и systemctl, в основном просто не работают в Docker, и вы должны полностью их игнорировать.

В тот момент, когда выполняется сценарий точки входа, это буквально единственная вещьэто работает. Это означает, что вам не нужно перезапускать nginx, потому что он еще не запустился в первый раз. Стандартный шаблон здесь - использовать скрипт точки входа для первоначальной настройки;ей будет передана фактическая команда для запуска в качестве аргументов, поэтому вы должны указать ей, чтобы они запускались.

#!/bin/sh

echo "in entrypoint"
# ... do first-time setup ...

# ...then run the command, nginx or otherwise
exec "$@"

(Попробуйте запустить docker run --rm -it myimage /bin/sh. Вы получите интерактивную оболочку в новом контейнере, но после эта первоначальная настройка произошла.)

Единственное, что вы теряете в своем Dockerfile, это значение по умолчанию CMD из базового образа (установка ENTRYPOINT сбрасывает это),Вам необходимо добавить обратно , что CMD:

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

Вы должны сохранить другие настройки из базового образа, такие как ENV определения и EXPOSE d порты.

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

Команда "systemctl" специфична для некоторых операционных систем на базе SystemD. Но у вас нет такого демона SystemD, работающего на PID 1, поэтому даже если вы установите эти пакеты, он не будет работать.

В файле nginx.service можно только проверить, какая команда, которую "перезагрузка" будет выполнять дляреальный. Или сделайте что-то вроде скрипта docker-systemctl-replace , сделав это за вас.

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

это будет работать с помощью команды service:

echo "in entrypoint"

# I want to run some commands here... 

# After I want to run nginx normally....

nginx -t && service nginx reload

echo "after reload"

вывод:

in entrypoint
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Restarting nginx: nginx.
after reload
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...