Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 在容器中运行多个脚本_Docker_Shell_Docker Compose_Dockerfile - Fatal编程技术网

Docker 在容器中运行多个脚本

Docker 在容器中运行多个脚本,docker,shell,docker-compose,dockerfile,Docker,Shell,Docker Compose,Dockerfile,我想在docker文件中添加多个脚本,并在容器启动时运行它。startup.sh是一个应用程序,只有当它启动并运行时,我们才能运行playbook.sh。这是我的码头工人 version: '3.4' services: rstudio_package_manager: privileged: true image: 'rspm_gh:sid' restart: always build: context: ./ dockerfile

我想在docker文件中添加多个脚本,并在容器启动时运行它。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

如果您有任何帮助,我们将不胜感激。

您不能在docker映像中有多个入口点。但是,您可以使用alternative启动多个进程

例如,您可以使用来管理您的流程

在容器中安装supervisor

运行apt get install-y supervisor

将管理器配置文件从主机复制到容器

复制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”]

在docker映像中不能有多个入口点。但是,您可以使用alternative启动多个进程

例如,您可以使用来管理您的流程

在容器中安装supervisor

运行apt get install-y supervisor

将管理器配置文件从主机复制到容器

复制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”]

在dockerfile中只能有一个入口点。理想情况下,您应该在单独的容器中运行这两个脚本。您可以指导如何操作吗?将当前服务拆分为两个单独的服务。我认为您可以将两个sh文件和当前的entrypoint命令合并为一个文件,首先是
tini--
,然后是startup.sh的内容,最后是playbook.sh的内容。您可以在这里重写代码作为答案,以便检查@AdamP。dockerfile中只能有一个入口点。理想情况下,您应该在单独的容器中运行这两个脚本。您可以指导如何操作吗?将当前服务拆分为两个单独的服务。我认为您可以将两个sh文件和当前的entrypoint命令合并为一个文件,首先是
tini--
,然后是startup.sh的内容,最后是playbook.sh的内容。您可以在这里重写代码作为答案,以便检查@阿丹普。