容器日期不会在入口点脚本中更新

Container date won't update in entrypoint script

提问人:gonzalloe 提问时间:7/21/2022 最后编辑:mkrieger1gonzalloe 更新时间:7/22/2022 访问量:75

问:

我使用下面的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 秒,日志就会有一些相同的日期值。以下是容器的日志:

container log

当我尝试在容器内手动编写脚本时,也发生了同样的事情:

enter image description here

当我只在容器控制台中键入内容时,时间戳始终正确显示。date

为什么日期不更新?我在剧本中错过了什么?

bash docker eof alpine-linux docker-entrypoint

评论

0赞 KamilCuk 7/21/2022
sh -c 'sh -s'?

答:

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 -sentrypoint

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.gzechosh -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 -ssh -c 'sh -c 'sh -c 'sh -c '....sh -csh -s