我想在我的容器内继续运行 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
,因此您最好使用bash
,sh
因为您可能会遇到与bash
和dash
存在一些差异的问题。
我认为您可以做的另一件事是,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/abc
RUN mkdir -p /home/abc/abc1
RUN mkdir -p /home/abc/abc2
Dockerfile
答案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