docker - 在一个容器中运行多个脚本
问题描述
我想在我的 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"]
启动.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 映像中有多个入口点。但是,您可以使用替代方法来启动多个进程。
例如,您可以使用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 中使用此命令启动主管
CMD ["supervisord"]
推荐阅读
- python - 为什么双斜杠出现在python路径中
- python - 基于公共元素的python字典组合
- android - canvas如何去掉连接处的线? android canvas
- flutter - Flutter - Google Id Token 显示为空
- javascript - 无法向打印机发送数据 - zebra gt430x
- python - 如何将字符串附加到 Pandas 索引
- html - 为什么不能在 Tailwind css 中设置为 100% 宽度
- python - 在 GitHub Actions 中使用 Python 运行 Firestore 模拟器
- html - 使用属性“contenteditable”更改文本框的大小
- javascript - 在 javascript 中修改对象键