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