我需要使用 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
(這其他答案對於您的用例來說可能是更優雅的解決方案。但這個問題略有不同,答案也略有不同。所以供參考。另外,好像你的要求應該變得更複雜...)