はじめに
今回、自分の作成したプログラムを提供して使ってもらうのに、
- 毎回 docker run して使う
- 引数を docker run のコマンドラインで指定する
という形でプログラムの整備をしました。そのメモを書きます。これは昨今の流れに従うもので、このようにして提供されているオープンソースで使われる一般の使い方のようです。
自作のプログラムで
$ prog <arg1> <args2>
と整備したものを、そのままdocker image に整備して
$ docker run -t prog_image <arg1> <arg2>
として利用できるようになります。
次を参考にしてできました。
-
コンテナ内で複数のサービスを実行
docker-docs-jp より:Docs » プロダクションでアプリを実行 » コンテナ設定 » コンテナ内で複数のサービスを実行) -
Docker コンテナの動作に必要な設定を起動時に渡す
例がとても分かり易い。説明も丁寧な投稿。
上記の情報で十分だと思いますが、あえてハマりポイントを挙げると、、、
- 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)