#docker #shell #docker-compose #dockerfile
#docker #оболочка #docker-создать #dockerfile
Вопрос:
Я хочу добавить несколько сценариев в свой файл docker и запустить его, когда контейнер запущен. startup.sh это приложение, и только когда оно запущено и запущено, мы можем его запустить playbook.sh . Это мой docker-compose
version: '3.4'
services:
rstudio_package_manager:
privileged: true
image: 'rspm_gh:sid'
restart: always
build:
context: ./
dockerfile: ./Dockerfile
ports:
- 34242:4242
- 32121:2121
environment:
- RSPM_LICENSE=My license
volumes:
- ./playbook.sh/:/tmp/playbook.sh
- ./startup.sh/:/usr/local/bin/startup.sh
Это мой Dockerfile
FROM rstudio/rstudio-package-manager:latest
# Expose necessary ports
EXPOSE 4242/tcp
EXPOSE 2112/tcp
RUN ["chmod", " x", "/usr/local/bin/startup.sh"]
# Specify the entry point and startup command
ENTRYPOINT ["tini", "--"]
CMD ["/usr/local/bin/startup.sh","/tmp/playbook.sh"]
startup.sh
#!/bin/bash
set -e
set -x
# Deactivate license when it exists
deactivate() {
echo "Deactivating license ..."
/opt/rstudio-pm/bin/license-manager deactivate >/dev/null 2>amp;1
}
trap deactivate EXIT
# Activate License
if ! [ -z "$RSPM_LICENSE" ]; then
/opt/rstudio-pm/bin/license-manager activate $RSPM_LICENSE
elif ! [ -z "$RSPM_LICENSE_SERVER" ]; then
/opt/rstudio-pm/bin/license-manager license-server $RSPM_LICENSE_SERVER
elif test -f "/etc/rstudio-pm/license.lic"; then
/opt/rstudio-pm/bin/license-manager activate-file /etc/rstudio-pm/license.lic
fi
# lest this be inherited by child processes
unset RSPM_LICENSE
unset RSPM_LICENSE_SERVER
# Start RStudio Package Manager
/opt/rstudio-pm/bin/rstudio-pm --config /tmp/temp/rstudio-pm.gcfg
Это моя пьеса.файл sh
#!/bin/bash
alias rspm='/opt/rstudio-pm/bin/rspm'
rspm create repo --name=prod-cran --description='Access CRAN packages'
rspm subscribe --repo=prod-cran --source=cran
rspm sync --wait
Любая помощь будет оценена
Комментарии:
1. У вас может быть только одна точка входа в dockerfile. В идеале вы должны запускать оба скрипта в отдельных контейнерах
2. Можете ли вы указать, как это сделать?
3. Разделите текущую службу на две отдельные службы.
4. Я думаю, вы можете объединить два файла sh и текущую команду entrypoint в один файл, который начинается с
tini --
после этого содержимого fof startup.sh и, наконец, содержание playbook.sh5. Можете ли вы переписать код в качестве ответа здесь, чтобы его было легко проверить. @AdamP.
Ответ №1:
В образе docker не может быть нескольких точек входа.Однако вы можете использовать альтернативу для запуска нескольких процессов.
Например, вы можете использовать supervisor для администрирования вашего процесса
Установите supervisor в свой контейнер
RUN apt-get install -y supervisor
Скопируйте файл конфигурации супервизора с хоста в ваш контейнер
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
[supervisord]
nodaemon=true
[program:playbook]
command=/bin/sh -c "/tmp/playbook.sh"
[program:startup]
command=/bin/sh -c "/usr/local/bin/startup.sh"
В вашем Dockerfile используйте эту команду для запуска supervisor
CMD ["supervisord"]