Dockerfile RUN shell-скрипт не работает во время сборки docker

Я пытаюсь создать собственный образ для сервера EMQ MQTT. Но сценарий update_config.sh не выполняется во время соединения докера.

Dockerfile:

FROM emqttd-docker-v2.3.5

# change configuration file
ADD update_config.sh /opt/emqttd/etc/update_config.sh
ADD ./certs/MyEMQ1.key /opt/emqttd/etc/certs/MyEMQ1.key
ADD ./certs/MyEMQ1.pem /opt/emqttd/etc/certs/MyEMQ1.pem
ADD ./certs/MyRootCA.pem /opt/emqttd/etc/certs/MyRootCA.pem


WORKDIR /opt/emqttd/etc/

#update the emqtt config file
RUN /bin/ash -c /opt/emqttd/etc/update_config.sh

update_config.sh

#!/bin/ash

cd /opt/emqttd/etc
cp ./emq.conf ./emq.conf.bak
sed -i 's|.*listener.ssl.external.keyfile.*|listener.ssl.external.keyfile = etc/certs/MyEMQ1.key|g' ./emq.conf
sed -i 's|.*listener.ssl.external.certfile.*|listener.ssl.external.certfile = etc/certs/MyEMQ1.pem|g' ./emq.conf
sed -i 's|.*listener.ssl.external.cacertfile.*|listener.ssl.external.cacertfile = etc/certs/MyRootCA.pem|g' ./emq.conf
sed -i 's|.*listener.ssl.external.verify.*|listener.ssl.external.verify = verify_peer|g' ./emq.conf

Я использую docker-compose для создания образа. Сценарий update_config.sh копируется в образ, но не выполняется.

Что я пробовал до сих пор:

  • Использовать COPY вместо ADD для копирования файла
  • Попробовал RUN /bin/ash -c /opt/emqttd/etc/update_config.sh в следующих ароматах:
    • RUN /bin/ash -c /opt/emqttd/etc/update_config.sh
    • RUN /opt/emqttd/etc/update_config.sh
    • RUN ./update_config.sh
  • Пытался добавить RUN chmod +x /opt/emqttd/etc/update_config.sh до линии RUN /bin/ash -c /opt/emqttd/etc/update_config.sh что приводит к ошибке chmod: /opt/emqttd/etc/update_config.sh: операция не разрешена во время сборки

Может кто-нибудь мне помочь? Благодарю.

2 ответа

Просто добавь ENTRYPOINT ["/bin/bash", "update_config.sh" ] это как твоя последняя строчка. А также update_config.sh файл, чтобы запустить ваше приложение и сделать ваш контейнер в бесконечном цикле.

Пример update_config.sh:

    #!/bin/ash

    cd /opt/emqttd/etc
    cp ./emq.conf ./emq.conf.bak
    sed -i 's|.*listener.ssl.external.keyfile.*|listener.ssl.external.keyfile = etc/certs/MyEMQ1.key|g' ./emq.conf
    sed -i 's|.*listener.ssl.external.certfile.*|listener.ssl.external.certfile = etc/certs/MyEMQ1.pem|g' ./emq.conf
    sed -i 's|.*listener.ssl.external.cacertfile.*|listener.ssl.external.cacertfile = etc/certs/MyRootCA.pem|g' ./emq.conf
    sed -i 's|.*listener.ssl.external.verify.*|listener.ssl.external.verify = verify_peer|g' ./emq.conf
    sh start_your_app.sh
    touch 1.txt;tail -f 1.txt #This will make your container in running infinite so that even after all the steps of this script has been executed your container will continue running. until you kill tail -f 1.txt command.

Надеюсь, это поможет. Спасибо!

Пепел - это одна из самых маленьких раковин. Этот интерпретатор команд имеет 24 встроенных команды и 10 различных параметров командной строки.

У Ash есть не все команды, которые вам нужны. Вы должны использовать /bin/bash

Другие вопросы по тегам