我的Dockerfile有一个在ENTRYPOINT上运行的脚本。容器被定义为与我的代码所在的卷挂载一起运行,一旦容器与卷挂载一起运行,它就需要运行一组命令。
但是从我在运行容器时得到的错误中,我倾向于相信Docker卷挂载发生在ENTRYPOINT脚本执行之后?
一旦容器启动,我肯定可以使用 docker exec 选项运行命令。但这使得它不那么流畅,代码行更多。是否有任何变通方法,可能是使用docker-compose?
Dockerfile:
FROM my-container
WORKDIR /my-mount-dir
ADD startup-script.sh /root/startup-script.sh
ENTRYPOINT ["/root/startup-script.sh"]
Docker运行:
docker run -itd -v /home/user/directory:/my-mount-dir build-container
**注意:**startup-script.sh包含了一些命令,这些命令应该与挂载目录中的文件进行交互。
3条答案
按热度按时间hyrbngr71#
我不确定这是否是你想要的解决方案,但我一直在使用这个run命令,它使用cat命令将我的
script.sh
提供给容器:在这种情况下,脚本将在装载完成后运行。我确信这一点,因为我已经在脚本中使用了挂载卷中的文件。
goucqfw62#
我在我的一些脚本中看到过,对我来说,这看起来像是文件系统缓存问题...我在我的docker文件中使用了以下技巧,它的工作原理很有魅力:
ENTRYPOINT ls /my-mount-dir && /root/startup-script.sh
但是这样就不能使用ENTRYPOINT的列表形式
nfeuvbwi3#
入口点脚本在卷装载后运行。我遇到了类似的问题,但实际上是由于在入口点周围使用单引号而不是双引号。因此,容器退回到使用默认入口点
/bin/sh
。由于你的问题已经得到了回答,我把这个留给其他通过谷歌最终到达这里的人。这一点:
不是这个: