Dockerコンテナのbashファイルで相対パスを使用する

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"]

次に、次の2つのコマンドを使用してビルドして実行します。

 $ 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

"monster" ディレクトリが見つからないようです。

私が見るには奇妙に見えてテストをしてみたかったです。テストするために、最後の「CMD」行を削除して再構築しました。今-itコンテナの中で遊ぶために旗を持って走っています。

実行したいshファイルをCDにコピーして実行してみます。

root@e3b83ca56f0b:/home/bob/monster/files# sh start.sh 

これはうまくいき、netcatを通して見つけることができます。その後、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 ファイル自体ではなく呼び出しファイルの相対パスを探します。

デフォルトのFirectorでbashファイルを呼び出しますが、まだbashファイルで相対パスを使用する方法は?

編集する:

「ファイル」ディレクトリは次のとおりです。

└── files
    ├── flag.txt
    ├── monster
    └── start.sh

ベストアンサー1

ディレクトリからスクリプトを実行すると、スクリプトが機能すると言われました/home/bob/monster/files。これは、スクリプトが自分と同じディレクトリに実行可能ファイル()を探しているように見えるため、エラーメッセージと一致しますexecvp("./monster", "./monster")

しかし、dockerfileにはWORKDIR /home/bob/monster1レベル以上の.のみがあります。 2番目のWORKDIRディレクティブを追加すると、トリックが実行されます。

COPY /files files
WORKDIR files

/home/bob/monster/filesこれにより、スクリプトが期待どおりに機能するように内部に移動します。

説明書WORKDIR:https://docs.docker.com/engine/reference/builder/#workdir

おすすめ記事