linux Docker ENTRYPOINT在卷装载后运行

a0x5cqrl  于 2023-05-16  发布在  Linux
关注(0)|答案(3)|浏览(165)

我的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包含了一些命令,这些命令应该与挂载目录中的文件进行交互。

hyrbngr7

hyrbngr71#

我不确定这是否是你想要的解决方案,但我一直在使用这个run命令,它使用cat命令将我的script.sh提供给容器:

docker run -it --name=some_name --rm \
  -v "host/path:/path/inside/container" \
  image_name \
  /bin/bash  -c "$(cat ./script.sh)"

在这种情况下,脚本将在装载完成后运行。我确信这一点,因为我已经在脚本中使用了挂载卷中的文件。

goucqfw6

goucqfw62#

我在我的一些脚本中看到过,对我来说,这看起来像是文件系统缓存问题...我在我的docker文件中使用了以下技巧,它的工作原理很有魅力:
ENTRYPOINT ls /my-mount-dir && /root/startup-script.sh
但是这样就不能使用ENTRYPOINT的列表形式

nfeuvbwi

nfeuvbwi3#

入口点脚本在卷装载后运行。我遇到了类似的问题,但实际上是由于在入口点周围使用单引号而不是双引号。因此,容器退回到使用默认入口点/bin/sh。由于你的问题已经得到了回答,我把这个留给其他通过谷歌最终到达这里的人。
这一点:

ENTRYPOINT ["entrypoint.sh"]

不是这个:

ENTRYPOINT ['entrypoint.sh']

相关问题