web-dev-qa-db-ja.com

Alpine DockerコンテナーでBashスクリプトを実行するにはどうすればよいですか?

Dockerfilesayhello.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固有です)。

29
Kurt Peek

Alpineには、/bin/shの代わりに/bin/bashがデフォルトのシェルとして付属しています。

だからあなたはできる

  1. Saybango.shの最初の行として/ bin/shを定義するシバンがあるので、sayhello.shのファイルは

    #!/bin/sh
    
  2. Bashが存在すると予想されるように、Dockerfileに次の行を追加して、AlpineイメージにBashをインストールします。

    RUN apk add --update bash && rm -rf /var/cache/apk/*
    
47
user2915097

この回答 は完全に正しく、正常に機能します。

別の方法があります。 AlpineベースのDockerコンテナでBashスクリプトを実行できます。

以下のようにCMDを変更する必要があります。

CMD ["sh", "sayhello.sh"]

これも機能します。

15
aerokite

すべてのスクリプトの実行権限を忘れずに付与してください。

FROM Alpine
COPY sayhello.sh /sayhello.sh
RUN chmod +x /sayhello.sh
CMD ["/sayhello.sh"]
6
debus

CMDを使用して、DockerはPATHsayhello.shファイルを検索しますが、PATHにない/にコピーしました。

したがって、実行するスクリプトへの絶対パスを使用します。

CMD ["/sayhello.sh"]

ところで、@ user2915097が言ったように、スクリプトがシバンでそれを使用している場合、AlpineにはデフォルトでBashがないことに注意してください。

2
zigarn