私は非常に単純な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/monster
1レベル以上の.のみがあります。 2番目のWORKDIR
ディレクティブを追加すると、トリックが実行されます。
COPY /files files
WORKDIR files
/home/bob/monster/files
これにより、スクリプトが期待どおりに機能するように内部に移動します。
説明書WORKDIR
:https://docs.docker.com/engine/reference/builder/#workdir