![复合 Docker 入口点?](https://linux22.com/image/88569/%E5%A4%8D%E5%90%88%20Docker%20%E5%85%A5%E5%8F%A3%E7%82%B9%EF%BC%9F.png)
我需要使用 Duplicity 将 docker 卷备份到另一个 docker 卷中的特定目录。所以我需要在执行备份的容器中运行这样的命令:
mkdir -p /backup/$backup-label
duplicity /target file:///backup/$backup-label
因此,我创建了一个包含口是心非的 docker 映像,以便我可以运行上述命令,并将要备份的卷映射/target
到将备份存储到的卷/backup
。
所以我的问题是如何将 $backup-label 传递给run
命令以及如何创建入口点,以便确保在运行如上所述的口是心非之前存在正确的目录结构?
蒂亚,奥莱
PS 如果我可以像这样运行容器:
ole@MKI:~$ docker run --rm -it -v data-volume:/target -v backup-volume/label-for-backup:/backup duplicity-backup-image
这样就解决了。但显然 docker 不允许在卷内映射子目录。当我尝试时,我收到以下消息:
docker: Error response from daemon: create backup-volume/label-for-backup: "backup-volume/label-for-backup" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed.
答案1
一个好的解决方案是使用 shell 脚本 asCMD
或ENTRYPOINT
。
如果要将变量传递到脚本中,可以使用 -e 将任何环境变量传递到脚本中:docker run -e backup-label=somelabel
。此选项的优点是您可以配置各个区域而无需解释参数。我建议也研究一下${variable:-}
句法。
在你的情况下:docker run --rm -e backup-label=somelabel -it -v data-volume:/target -v backup-volume/label-for-backup:/backup duplicity-backup-image
shell脚本(确保它是可执行的):
#!/bin/sh
mkdir -p /backup/$backup-label
duplicity /target file:///backup/$backup-label
(这其他答案对于您的用例来说可能是更优雅的解决方案。但这个问题略有不同,答案也略有不同。所以供参考。另外,好像你的要求应该变得更复杂......)