【问题标题】:How to run command on container startup, and keep container running after command is done?如何在容器启动时运行命令,并在命令完成后保持容器运行?
【发布时间】:2021-11-05 05:42:12
【问题描述】:

我有一个Dockerfile,意思是使用script1,像这样:

# Pull from Debian
FROM debian
    
# Update apt and install dependencies
RUN apt update
RUN apt -y upgrade
RUN apt -y install wget curl
    
# Download script1.sh
RUN wget -O ./script1.sh https://example.com
    
# Make script1.sh executable
RUN chmod +x ./script1.sh

目前,我可以:

  1. 将此 Dockerfile 构建到映像中
  2. 在容器中运行所述图像
  3. 在所述容器中打开 CLI,并手动运行 script1(使用 bash ./script1.sh
  4. 脚本运行,容器保持打开状态。

但是,我想在容器启动时自动运行此脚本。

所以我尝试将我的Dockerfile 更改为:

# Pull from Debian
FROM debian

# Update apt and install dependencies
RUN apt update
RUN apt -y upgrade
RUN apt -y install wget curl

# Download script1.sh
RUN wget -O ./script1.sh https://example.com

# Make script1.sh executable
RUN chmod +x ./script1.sh

# Run script1.sh on startup
CMD bash ./script1.sh

但是,当我这样做时,容器只保持打开一点,然后立即退出。

我怀疑它会在script1 完成后立即退出...

我也试过ENTRYPOINT,但没有多大成功。

如果我打开 CLI 并手动运行脚本,为什么我的容器会保持打开状态,但如果我尝试在启动时自动运行它却不会保持打开状态?

如何在容器启动时自动运行脚本,并防止容器立即退出?

【问题讨论】:

  • 当你说“容器保持打开”时,它应该运行什么进程?或者如果没有特定的过程,为什么容器本身很重要? (“当我运行ls时,如何防止进程在写入目录列表后退出?”)
  • 我认为您应该提供 script1.sh 或至少可以说明其作用的内容。

标签: docker shell dockerfile docker-container docker-image


【解决方案1】:

一个旧的 Docker (v2) 防止容器过早关闭的技巧在于让在其中运行“无限”循环命令,例如:

CMD tail -f /dev/null

【讨论】:

  • 我试过CMD bash ./script1.sh && tail -f /dev/null,但没用。我应该如何使用这个命令?
  • Dockerfile: FROM debian CMD ls /usr && tail -f /dev/null Build: docker build -t temp . Run docker run --rm temp
  • @antoniopgs 大概,您的脚本以非零退出代码退出。因此,tail 命令不会被执行(因为如果第一个进程失败,&& 会短路)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
相关资源
最近更新 更多