容器启动后在docker中运行多个命令

时间:2021-04-09 00:07:11

标签: ruby linux bash docker shell

如何在容器启动后运行/bin/run1.sh 和/bin/run2.sh! 另外,如果您能告诉我如何将 /bin/run1.sh 和 /bin/run2.sh 的日志发送到容器日志!!

Docker 文件

FROM ruby:2.5
COPY run1.sh /bin
COPY run2.sh /bin
RUN chmod +x /bin/run1.sh
RUN chmod +x /bin/run2.sh
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
CMD ["rails", "server", "-b", "0.0.0.0"]

entrypoint.sh

#!/bin/bash
set -e
# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

run1.sh

#!/bin/sh
echo `date` $@ >> /log.txt;
cat log.txt;

run2.sh

#!/bin/sh
echo `date` $@ >> /log2.txt;
cat log.txt;

1 个答案:

答案 0 :(得分:0)

您可以将 ENTRYPOINT ["entrypoint.sh"] 更改为 ENTRYPOINT ["entrypoint.sh", "run1.sh", "run2.sh"],这将运行您的自定义 bash 脚本

如果log.txt文件不存在,你还需要创建它并添加exec "$@"来恢复容器的主进程

因此您的 runX.sh 文件应如下所示

#!/bin/sh
touch log.txt;
echo `date` $@ >> log.txt;
cat log.txt;
exec "$@"

请注意,如果您在 rails 上运行 DB 迁移,则应将它们记录在您的应用程序日志中,该日志可以通过 docker 容器本身访问(从 docker ps 获取 docker id,然后访问 bash docker exec -it /bin/bash您可以在其中导航到 /logs/{your environment}.log)