Запуск нескольких скриптов в контейнере

Я хочу добавить несколько сценариев в свой файл докера и запустить его, когда контейнер будет запущен. startup.sh — это приложение, и только когда оно запущено, мы можем запустить playbook.sh. Это мой докер-композитор

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

Это мой докерфайл

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>&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

Это мой файл playbook.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

Любая помощь будет оценена

У вас может быть только одна точка входа в dockerfile. В идеале вы должны запускать оба скрипта в отдельных контейнерах.

Raman Sailopal 22.12.2020 15:57

Можете подсказать как это сделать?

Siddharth 22.12.2020 15:59

Разделить текущий сервис на два отдельных сервиса.

Raman Sailopal 22.12.2020 16:01

Я думаю, вы можете объединить два файла sh и текущую команду точки входа в один файл, который начинается с tini --, после чего содержимое fof startup.sh и, наконец, содержимое playbook.sh

adampweb 22.12.2020 16:11

Можете ли вы переписать код в качестве ответа здесь, чтобы его было легко проверить. @АдамП.

Siddharth 22.12.2020 16:23
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
5
1 055
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас не может быть нескольких точек входа в образе докера. Однако вы можете использовать альтернативу для запуска нескольких процессов.

Например, вы можете использовать супервайзер для администрирования вашего процесса.

Установите супервизор в свой контейнер

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 используйте эту команду для запуска супервизора

CMD ["supervisord"]

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