Docker

在 docker 容器的 bash 文件中使用相對路徑

  • January 2, 2022

我有一個相當簡單的 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,這將允許腳本按預期工作。

說明文件WORKDIRhttps ://docs.docker.com/engine/reference/builder/#workdir

引用自:https://unix.stackexchange.com/questions/684653