在 docker 中运行后台脚本

在 docker 中运行后台脚本

我想在我的容器内继续运行 2 个 shell 脚本。这些脚本应在我启动容器时启动。

FROM centos:8

# Update the image with the latest packages (recommended)
RUN yum update -y && yum install libnsl net-tools -y && yum clean all; 

RUN mkdir -p /home/abc
ENV HOME /home/abc
WORKDIR ${HOME}

COPY *.gz /home/abc/
COPY start.sh /home/abc

RUN ls *.gz | xargs -i tar xf {} && rm *.gz

RUN bash -c "sh /home/abc/start.sh & sleep 5 && tail -f /dev/null"

EXPOSE 1234
EXPOSE 5678

内容start.sh

#!/bin/bash

cd /home/abc/abc1/
./process1.sh &

cd /home/abc/abc2/
./process2.sh &

你能帮我吗?

答案1

process1.sh让我们假设和的内容process2.sh都很好,所以你的Dockerfile应该看起来像这样:

FROM centos:8

# Update the image with the latest packages (recommended)
RUN yum update -y && yum install libnsl net-tools -y && yum clean all; 

RUN mkdir -p /home/abc
ENV HOME /home/abc
WORKDIR ${HOME}

COPY *.gz /home/abc/
COPY start.sh /home/abc
RUN chmod +x /home/abc/start.sh

RUN ls *.gz | xargs -i tar xf {} && rm *.gz

EXPOSE 1234
EXPOSE 5678
ENTRYPOINT ["/home/abc/start.sh"]

我删除了,RUN bash -c "sh /home/abc/start.sh & sleep 5 && tail -f /dev/null"因为我认为它没有必要。另外,由于您start.sh是从 shebang 开始的#!/bin/bash,因此您最好使用bashsh因为您可能会遇到与bashdash存在一些差异的问题。

我认为您可以做的另一件事是,start.sh如果这两个文件没有执行权限,则编辑您的内容:

#!/bin/bash

cd /home/abc/abc1/ && chmod +x process1.sh
./process1.sh &

cd /home/abc/abc2/ && chmod +x process2.sh
./process2.sh &

此外,如果您.gz没有在里面创建文件abc1和目录,那么您应该将和添加到您的。abc2/home/abcRUN mkdir -p /home/abc/abc1RUN mkdir -p /home/abc/abc2Dockerfile

答案2

我建议您的 Dockerfile 负责设置该脚本的权限并像这样运行它:

...
COPY start.sh /home/abc
RUN chmod -v +x /home/abc/start.sh
CMD ["/home/abc/start.sh"]

然后在 start.sh 中,使用您喜欢的任何方法来创建一个调用其他脚本的无限循环。例如:

#!/bin/bash

# Exit immediately if a command exits with a non-zero status.
set -e

for (( ; ; ))
do
    # Your shell scripts should go in here.  I've got them commented
    # and am just running a few commands instead
    #/home/abc/abc1/process1.sh &
    #/home/abc/abc2/process2.sh &
    ls /
    cat /etc/passwd

    # Sleep for 1 seconds
    sleep 1
done

相关内容