繁体   English   中英

在 docker-compose 命令中动态替换当前时间

[英]Dynamically replace current time inside docker-compose command

version: '3.7'

services:
  pgdump:
    image: postgres:alpine
    command: pg_dump -f "backup-`date -u -Iseconds`.pg_restore" $DATABASE_URL

这会产生一个名为

backup-`date -u -Iseconds`.pg_restore

而不是想要的

backup-2021-04-14T16:42:54+00:00.pg_restore

我也试过:

command: pg_dump -f backup-`date -u -Iseconds`.pg_restore $DATABASE_URL

command: pg_dump -f "backup-${date -u -Iseconds}.pg_restore" $DATABASE_URL

command: pg_dump -f backup-${date -u -Iseconds}.pg_restore $DATABASE_URL

它们都产生不同的错误。

根据此GitHub 问题,截至 2021 年 4 月,docker-compose 不支持命令替换。

作为我的用例中的一种解决方法,可以使用本机docker run命令,其中替换起作用或使用.env文件。

当前命令

date 命令本身不正确。 尝试自行运行

date -u -Iseconds
echo `date -u -Iseconds`

根据您的命令,我假设您想要自纪元以来的 UTC 秒数? 纪元本身就是UTC。 所以你只需要几秒钟就可以了。 不需要-u参数。

解决方案

下面是两个 forms 中的正确命令:

一个。

    command: pg_dump -f "backup-`date +'%s'`.pg_restore" $DATABASE_URL

B.

    command: pg_dump -f "backup-$(date +'%s').pg_restore" $DATABASE_URL

解释

在您提供的命令中,有很多事情需要注意:

  1. 注意到文件名周围的双引号了吗? 这意味着您不能在没有 escaping 的内部对使用\的情况下在原始外部对中嵌套另一个双引号。 另一种选择是在一对双引号中使用尽可能多的单引号对。 请参阅此答案和有关2.2.2 Single-Quotes2.2.3 Double-Quotes摘录
  2. 对于字符串插值,您可以使用$()``表示法。 但不像我说的那样在单引号内。
  3. 作为试运行测试,直接使用上述符号创建一个文件:
vi "backup-`date +'%s'`.txt"
vi "backup-$(date +'%s').txt"
  1. 至于日期格式。 GNU/date BSD/date都接受%s来表示自 Epoch 以来的秒数。 ss64man7cyberciti中找到“%s”。
  2. Docker相关的,注意命令的作用。 来源

command会覆盖容器镜像(即 Dockerfile 的 CMD)声明的默认命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM