如何在容器启动时运行命令,并在命令完成后保持容器运行?

3

我有一个 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时,如何使进程在写完其目录列表后不退出?”) - David Maze
我认为你应该提供script1.sh或者至少提供一些例子来说明它的作用。 - Marcello Romani
1个回答

1

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

CMD tail -f /dev/null

我尝试过使用 CMD bash ./script1.sh && tail -f /dev/null 命令,但它没有起作用。请问我该如何正确使用这个命令? - antoniopgs
Dockerfile: ```FROM debianCMD ls /usr && tail -f /dev/null 构建:```docker build -t temp .``` 运行:```docker run --rm temp``` <-- 列出容器内 /usr 的内容,然后继续运行而不执行任何操作。 - Marcello Romani
@antoniopgs 可能是因为您的脚本以非零退出代码退出。因此,尾部命令未被执行(因为 && 在第一个进程失败时会短路)。 - Frank Schmitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接