仅在第一次启动时在Docker Container中运行命令

我有一个Docker Image,它使用脚本( /bin/bash /init.sh )作为入口点。 我只想在容器的第一次启动时执行这个脚本。 当容器重启或者在docker守护进程崩溃后再次启动时,它应该被忽略。

有没有办法与docker本身做到这一点,或者如果必须在脚本中执行某种检查?

docker容器的入口点告诉docker守护进程当你想“运行”那个特定的容器时要运行什么。 让我们来问一下“第二次启动时容器应该运行什么? 或者“重启后容器应该运行什么?

可能你正在做的是遵循你使用“老派”configuration机制的相同方法。 你的脚本是“安装”所需的脚本,你将运行你的应用程序作为systemd / upstart服务,对不对? 如果你这样做,你应该改变成一个更“docker化”的定义。

该容器的入口点应该是一个实际启动应用程序而不是设置的脚本。 假设您需要安装java才能运行您的应用程序。 所以在dockerfile中,你设置了基本容器来安装你需要的所有东西:

 FROM alpine:edge RUN apk --update upgrade && apk add openjdk8-jre-base RUN mkdir -p /opt/your_app/ && adduser -HD userapp ADD target/your_app.jar /opt/your_app/your-app.jar ADD scripts/init.sh /opt/your_app/init.sh USER userapp EXPOSE 8081 CMD ["/bin/bash", "/opt/your_app/init.sh"] 

我们的容器,在我工作的公司,在运行init.sh脚本中的实际应用程序之前,他们从consul获取configuration文件(而不是提供挂载点并将configuration放入主机或embedded到容器中)。 所以脚本看起来像这样:

 #!/bin/bash echo "Downloading config from consul..." confd -onetime -backend consul -node $CONSUL_URL -prefix /cfgs/$CONSUL_APP/$CONSUL_ENV_NAME echo "Launching your-app..." java -jar /opt/your_app/your-app.jar 

我可以给你的一个build议是(在使用容器的时候我真的很短的经验),一旦提供了容器(在入口点之前运行的所有命令),就好像它们是无状态的。

我想在Windows容器上做同样的事情。 它可以在Windows上使用任务调度程序来实现。 等同于任务Scheduler的Linux是cron。 你可以用你的情况。 为此,编辑dockerfile并在最后添加以下行

 WORKDIR /app COPY myTask.ps1 . RUN schtasks /Create /TN myTask /SC ONSTART /TR "c:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe C:\app\myTask.ps1" /ru SYSTEM 

这创build一个任务名称myTask运行它ONSTART和它自己的任务是执行放置在“c:\ app \ myTask.ps1”的PowerShell脚本。

这个myTask.ps1脚本将执行你需要在容器启动时做的任何初始化。 确保在成功执行后删除此任务,否则将在每次启动时运行。 要删除它,您可以在myTask.ps1脚本的末尾使用以下命令。

 schtasks /Delete /TN myTask /F