Dockerfileでスクリプトを実行する


93

Dockerfileでビルドプロセス中にスクリプトを実行しようとしています。しかし、それはうまくいかないようです。

私はそのように試しました:

FROM php:7-fpm
ADD bootstrap.sh /
ENTRYPOINT ["/bin/bash", "/bootstrap.sh"]

また、このように:

FROM php:7-fpm    
ADD bootstrap.sh /
RUN bash -c "/bootstrap.sh"

また、実行中のコンテナを実行します。

docker exec symfony /bin/bash -c "/bootstrap.sh"

何も機能していないようです。

あなたはそれを行う方法を知っていますか?


bootstarp.sh実行ビットがセットされていますか?
jwodder 2015

そのように実行chmod + x /bootstarp.sh?
ケビン

2
「動作しない」では、正確に何が起こっているのでしょうか。エラーが表示されますか?画像内にファイルがありますか?docker exec -it symfony bashコンテナ内にいる場合、手動でスクリプトを実行して、その内容を確認できますか?(cat bootstarp.sh)?
thaJeztah 2016年

これを試してください:docker exec symfony /bin/bash /bootstarp.shそして私に出力を知らせてください。
Boynux 2016年

12
Ermahgerd bootstarp!
Bruno Bronosky 2017

回答:


128

RUNそして、ENTRYPOINTスクリプトを実行するには、2つの異なる方法です。

RUNつまり、中間コンテナを作成し、スクリプトを実行して、そのコンテナの新しい状態を新しい中間イメージでフリーズします。その後、スクリプトは実行されません。最終的な画像は、そのスクリプトの結果を反映しているはずです。

ENTRYPOINT イメージ(まだスクリプトを実行していない)がコンテナーを作成し、そのスクリプトを実行することを意味します。

どちらの場合も、スクリプトを追加する必要があり、aRUN chmod +x /bootstrap.shを使用することをお勧めします。

また、(のような)シバンで始まる必要があります#!/bin/sh

スクリプト(bootstarp.sh:いくつかのgit config --globalコマンド)を考慮するとRUN、そのスクリプトを1回実行するのが最適ですが、Dockerfile適切なユーザーを使用するようにしてください(グローバルgit configファイルは%HOME%/.gitconfig、デフォルトでは/root1つです)。

Dockerfileに追加します。

RUN /bootstart.sh

次に、コンテナを実行するときに、の内容をチェックして/root/.gitconfig、スクリプトが実行されたことを確認します。


5
また、あなたはbootstrap.sh代わりに意味したかもしれませんbootstarp.shstackoverflow.com/a/1254561/6309
VonC

涼しい!RUN /bootstrap.shで非常にうまく機能します
Kevin

1
最初の行のシェバンは私のためにそれをしました、ありがとう!:)
GDICommander 2017

33

上記の回答に加えて:

Windowsで.shスクリプトファイルを作成/編集した場合は、Unix形式で終わる行で保存されていることを確認してください。デフォルトでは、Windowsの多くのエディターはUnixの行末をWindows形式に変換し、Linuxはファイルの先頭にあるシバン(#!/ bin / sh)を認識しません。そのため、Linuxは、シバンがないかのようにエラーメッセージを生成します。

チップ:

  • Notepad ++を使用する場合は、「編集/ EOL変換/ UNIX(LF)」をクリックする必要があります。
  • Visual Studioを使用している場合は、私が「インストールを示唆している行の最後のプラグインを」。次に、Ctrl-R、Ctrl-Wを押して、行末を表示できます。Linuxスタイルのエンディングを設定するには、Ctrl-R、Ctrl-Lを押します。Windowsスタイルの場合は、Ctrl-R、Ctrl-Cを押します。

4
うわー、あなたは私の日を救った。これありがとう。
mw 2018年

2
鮮やかさ!これは私の正確な問題でした!
Kevinsyel

1
私のVSCodeは、Windowsでシェルスクリプトの行末をCRLFに自動的に設定していました。いくつかのランダムな文字が原因で、Dockerビルドが失敗していました。VS Codeの設定を変更すると、すぐに機能し始めました。ありがとう!私は賛成しました。
AdithyaUpadhya19年

24

ADDコマンドと作業ディレクトリの仕様を使用してスクリプトを作成してみてください。このように( "script"はスクリプトの名前であり/root/script.sh、コンテナ内の必要な場所です。別のパスにすることができます。

ADD script.sh /root/script.sh

この場合、ADD前に来るCMD必要があります。ところで、1つのところで、ホストマシンからコンテナ内の任意の場所にスクリプトをインポートするのはクールな方法です。

インCMDプレース[./script]

スクリプトが自動的に実行されます

WORKDIRとして指定することもできます/root。そうすると、コンテナの起動時に自動的にルートに配置されます


dockerはscript.shが最初にどこにあるかをどのように識別しますか?つまり、最初のパラメータscript.sh
日没

コンテナを構築しているので、パスの配置も担当します
Michael

最初のパラメータのパスと名前はscript.shDockerfile
eja

4

ローカルファイルシステムからイメージにコピーするときのCOPY代わりに使用することをADDお勧めします。また、コンテンツを配置するサブフォルダーを作成することをお勧めします。他に何もないとしても、それは物事を整頓します。を使用して、スクリプトを実行可能としてマークしてくださいchmod

ここではscripts、スクリプトを配置して実行するためのサブフォルダーを作成しています。

RUN mkdir -p /scripts
COPY script.sh /scripts
WORKDIR /scripts
RUN chmod +x script.sh
RUN script.sh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.