3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Docker】引数を指定してコマンドラインツールとして使う(wrapper script)

Last updated at Posted at 2020-10-17

はじめに

今回、自分の作成したプログラムを提供して使ってもらうのに、

  • 毎回 docker run して使う
  • 引数を docker run のコマンドラインで指定する

という形でプログラムの整備をしました。そのメモを書きます。これは昨今の流れに従うもので、このようにして提供されているオープンソースで使われる一般の使い方のようです。

自作のプログラムで

$ prog <arg1> <args2>

と整備したものを、そのままdocker image に整備して

$ docker run -t prog_image <arg1> <arg2>

として利用できるようになります。

次を参考にしてできました。

上記の情報で十分だと思いますが、あえてハマりポイントを挙げると、、、

  • CMDでなくENTRYPOINTで:これまでDockerfile で CMD で実行内容を指定していましたが、これだど引数を受け付けないようです。ETNRYPOINT にしたら動きました。
  • 実行権限: image 内部での権限が問題のように見えた時、RUN chmod +x を Dockerfile に書いたら動いた。(それでの良いのか^^;)

動作確認

構成

実現方法は、docker build で

  • 実行プログラムprogをインストールする
  • prog を実行するためのためのスクリプトを用意する(wrapper script を呼ぶらしい)
  • wrapper script を dockerfile の ENTRYPOINT に設定する

です。(直接実行プログラムを指定しても良さそうな気がしますが、シェルを通したほうがいろいろ良いことがあるのでしょうか。そこのところは分かりませんが。)

動作例

テスト用に作ってみました。

  • 実行プログラム。hello.c コマンドラインの引数を表示するプログラム。
hello.c

#include <stdio.h>
#include <stdlib.h>

int main(const int argc, const char**argv)
{
    for(int i=0; i< argc; i++){
        printf("argv[%d]=%s\n", i, argv[i]);
    }
    return EXIT_SUCCESS;
}
  • wrapper script: ただ引数を渡す
docker_entrypoint.sh
#!/bin/bash
echo "I am a wrapper script."
hello $@
  • Dockerfile: ビルドしてインストールし、wrapper script をentrypoint に指定する
FROM ubuntu:18.04

RUN apt-get update -y && \
  apt-get install -y -qq --no-install-recommends \
  build-essential \
  gcc

COPY hello.c /tmp/
RUN  cd /tmp && gcc /tmp/hello.c -o hello && mv hello /usr/local/bin/
COPY docker_entrypoint.sh /usr/local/bin

ENTRYPOINT ["docker_entrypoint.sh"]
  • いざ動かしてみる
> docker build -t test .
...
Successfully tagged test:latest

> docker run --rm -t test Dear my friends.
I am wrapper script.
argv[0]=hello
argv[1]=Dear
argv[2]=my
argv[3]=friends.

スクリプトなくても動作

今の場合、Dockerfile の ENTRYPOINT に直接実行プログラムを指定しても動きました。

ENTRYPOINT [ "hello" ]

まとめ

  • とりあえず、Linux で動く環境をそのままdocker run で動かすプログラムにする方法は分かった

今後の課題。

  • docker run の管理は、通常のcontainer の管理と同じだと思うが、要確認。CPUなどのリソースの指定や使用状況の取得、HEATHCHECK など気になる。
  • Wrapper を使う理由の理解を深める。複数のプログラムを組み合わせて逐次実行する指定をできたりするところかな。

今日(正確には昨日)も生き延びることができた。
(2020/10/17)

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?