Dockerfile
とsayhello.sh
の2つのファイルのみを含むディレクトリがあります。
.
├── Dockerfile
└── sayhello.sh
Dockerfile
読み取り
FROM Alpine
COPY sayhello.sh sayhello.sh
CMD ["sayhello.sh"]
およびsayhello.sh
には単に
echo hello
Dockerfile
は正常にビルドされます:
kurtpeek@Sophiemaries-MacBook-Pro ~/d/s/trybash> docker build --tag trybash .
Sending build context to Docker daemon 3.072 kB
Step 1/3 : FROM Alpine
---> 665ffb03bfae
Step 2/3 : COPY sayhello.sh sayhello.sh
---> Using cache
---> fe41f2497715
Step 3/3 : CMD sayhello.sh
---> Using cache
---> dfcc26c78541
Successfully built dfcc26c78541
ただし、run
にしようとすると、executable file not found in $PATH
エラーが発生します。
kurtpeek@Sophiemaries-MacBook-Pro ~/d/s/trybash> docker run trybash
container_linux.go:247: starting container process caused "exec: \"sayhello.sh\": executable file not found in $PATH"
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sayhello.sh\": executable file not found in $PATH".
ERRO[0001] error getting events from daemon: net/http: request canceled
これは何が原因ですか? (debian:jessie
ベースの画像で同様の方法でスクリプトを実行したことを思い出します。したがって、おそらくAlpine固有です)。
Alpineには、/bin/sh
の代わりに/bin/bash
がデフォルトのシェルとして付属しています。
だからあなたはできる
Saybango.shの最初の行として/ bin/shを定義するシバンがあるので、sayhello.shのファイルは
#!/bin/sh
Bashが存在すると予想されるように、Dockerfileに次の行を追加して、AlpineイメージにBashをインストールします。
RUN apk add --update bash && rm -rf /var/cache/apk/*
この回答 は完全に正しく、正常に機能します。
別の方法があります。 AlpineベースのDockerコンテナでBashスクリプトを実行できます。
以下のようにCMDを変更する必要があります。
CMD ["sh", "sayhello.sh"]
これも機能します。
すべてのスクリプトの実行権限を忘れずに付与してください。
FROM Alpine
COPY sayhello.sh /sayhello.sh
RUN chmod +x /sayhello.sh
CMD ["/sayhello.sh"]
CMD
を使用して、DockerはPATH
でsayhello.sh
ファイルを検索しますが、PATH
にない/
にコピーしました。
したがって、実行するスクリプトへの絶対パスを使用します。
CMD ["/sayhello.sh"]
ところで、@ user2915097が言ったように、スクリプトがシバンでそれを使用している場合、AlpineにはデフォルトでBashがないことに注意してください。