Docker
在 docker 容器的 bash 文件中使用相對路徑
我有一個相當簡單的 dockerfile,我需要將服務公開給埠,以便使用者可以通過 netcat 進入它。
FROM ubuntu:16.04 RUN apt-get update RUN apt-get install -y socat # Change to strict permissions RUN chmod 770 /bin/* /usr/bin/* RUN chmod 771 /bin/cat /bin/ls /bin/sh /usr/bin/socat # Add user bob RUN useradd -m -s /bin/sh bob EXPOSE 9000 # Add dir and change to working RUN mkdir /home/bob/monster WORKDIR /home/bob/monster # copy working files and change permissions COPY /files files CMD ["sh","/home/bob/monster/files/start.sh"]
然後,我使用以下兩個命令建構並執行:
$ sudo docker build -t intmonster . $ sudo docker run -p 9000:9000 --rm intmonster
這一切似乎都有效,除了我在我的主機系統上嘗試 netcat 到服務的那一刻:
$ nc 0.0.0.0 9000
這會在容器執行的終端中觸發此列印:
$ sudo docker run -p 9000:9000 --rm intmonster 2022/01/01 22:59:53 socat[9] E execvp("./monster", "./monster"): No such file or directory 2022/01/01 22:59:53 socat[8] W waitpid(): child 9 exited with status 1
在哪裡找不到“怪物”目錄。
這對我來說似乎很奇怪,因此我想做一些測試。為了測試,我刪除了最後一個“CMD”行,然後重新建構。我現在再次帶著
-it
旗子跑,以便在容器內玩耍。我 cd 到我想要執行的 sh 文件,並嘗試執行它:
root@e3b83ca56f0b:/home/bob/monster/files# sh start.sh
這行得通,我可以上網。然後我嘗試
cd ..
從那裡執行文件。乍一看它可以工作,但是當我嘗試 netcat 到該服務時,我收到以下錯誤:root@e3b83ca56f0b:/home/bob/monster# sh files/start.sh 2022/01/01 23:51:15 socat[46] E execvp("./monster", "./monster"): No such file or directory 2022/01/01 23:51:15 socat[45] W waitpid(): child 46 exited with status 1
我的理論是這個問題的發生是因為 bash 文件執行了一個名為“monster”的執行檔。當從主目錄執行時,程序會查找呼叫文件的相對路徑,而不是 bash 文件本身。
如何從家庭 firectory 呼叫 bash 文件,但仍然在我的 bash 文件中使用相對路徑?
編輯:
“文件”目錄如下所示:
└── files ├── flag.txt ├── monster └── start.sh
您已經提到該腳本在您從
/home/bob/monster/files
目錄執行時有效。這與錯誤消息一致,因為腳本似乎正在與自身相同的目錄中尋找執行檔 (execvp("./monster", "./monster")
)。但是,在 dockerfile 中,您只有
WORKDIR /home/bob/monster
,這是一個更高的級別。添加第二WORKDIR
條指令應該可以解決問題:COPY /files files WORKDIR files
這將使您進入
/home/bob/monster/files
,這將允許腳本按預期工作。說明文件
WORKDIR
:https ://docs.docker.com/engine/reference/builder/#workdir