提问人:gonzalloe 提问时间:7/21/2022 最后编辑:mkrieger1gonzalloe 更新时间:7/22/2022 访问量:75
容器日期不会在入口点脚本中更新
Container date won't update in entrypoint script
问:
我使用下面的docker-compose脚本构建了一个容器:
services:
client:
image: alpine
environment:
- BACKUP_ENABLED=1
- BACKUP_INTERVAL=60
- BACKUP_PATH=/data
- BACKUP_FILENAME=db_backup
networks:
- dbnet
entrypoint: |
sh -c 'sh -s << EOF
apk add --no-cache mysql-client
while true
do
then
sleep $$BACKUP_INTERVAL
echo "$$(date +%FT%H.%M) - Making Backup to : $$BACKUP_PATH/$$(date +%F)/$$BACKUP_FILENAME-$$(date +%FT%H.%M).sql.gz"
mysqldump -u root -ppassword -h dblb --all-databases | gzip > $$BACKUP_PATH/$$(date +%F)/$$BACKUP_FILENAME-$$(date +%FT%H.%M).sql.gz
done
EOF'
但是我遇到了一个问题,即日期不会更新,并导致循环将备份备份到相同的创建文件。
每隔 60 秒,日志就会有一些相同的日期值。以下是容器的日志:
当我尝试在容器内手动编写脚本时,也发生了同样的事情:
当我只在容器控制台中键入内容时,时间戳始终正确显示。date
为什么日期不更新?我在剧本中错过了什么?
答:
1赞
KamilCuk
7/21/2022
#1
为什么日期不更新?
因为它是通过外壳膨胀的。比较 shell 脚本:
#!/bin/sh
# in a script
# this is running inside a shell
cat <<EOF # cat just prints data
$(date) # not cat, **but the shell**, expands $(date)
EOF
与:
sh -c '
# this is running inside a shell
sh -s <<EOF # sh -s executes input data
echo $(date) # not sh -s, but **the outer shell**, expands $(date). ONCE
EOF
'
这都是非正统的,只需运行您要运行的命令即可。sh -c sh -s
entrypoint
command:
- sh
- -c
- |
apk add --no-cache mysql-client
while sleep $$BACKUP_INTERVAL; do
echo "$$(date +%FT%H.%M) - Making Backup to : $$BACKUP_PATH/$$(date +%F)/$$BACKUP_FILENAME-$$(date +%FT%H.%M).sql.gz"
done
评论
0赞
gonzalloe
7/21/2022
对不起,我想我遗漏了这一行.这应该在命令之后添加。执行输入数据是否仍然需要?mysqldump -u root -ppassword -h dblb --all-databases | gzip > $$BACKUP_PATH/$$(date +%F)/$$BACKUP_FILENAME-$$(date +%FT%H.%M).sql.gz
echo
sh -s
0赞
KamilCuk
7/21/2022
Sorry, I think I left out this line
我没有,你编辑了你的问题。 我看不出有什么理由需要。这就像你可以无限地链接。只是如果你想传递参数,或者如果你正在阅读 stdin .Does sh -s is still needed for executing input data?
sh -c 'sh -s
sh -c 'sh -c 'sh -c 'sh -c '....
sh -c
sh -s
评论
sh -c 'sh -s'
?