DockerコンテナをREST APIで立ち上げようとした際に、UbuntuイメージをベースにnpmやJavaなどのプログラム言語の実行環境を整えたうえで作成しようと思いました。
そして、それらのインストールコマンド自体は、REST API側で用意されています。
$param = array(
'Image' => 'ubuntu',
'Cmd' =>[
'apt-get update &&' .
' apt-get install -y nodejs npm iptables php' .
' apt-get install -y ruby' .
' apt-get install -y default-jre' .
' apt-get install -y python3' .
' npm install -g typescript ts-node' .
'npm start'
]
);
$url = 'http://host.docker.internal:2375/containers/create';
$response = Http::withHeaders(['Content-Type' => 'application/json'])
->post($url, $param);
上記のように、まずImageをubuntuで指定し、Cmdの配列にインストールしたいものを書いていきます。
ここで、Node.js、TypeScript、Ruby、Java、Pythonの環境構築がされています。
これでコンテナが作成されました。
あとは起動させましょう。
ですが、コンテナ内にアクセスしても、nodeJSなどのファイルはインストールされていません。
実行することはできないです。
/bin/sh: 1: node: not found
となってしまいます。
じゃあもう一度aptを実行してみるかと思っても、実行されません。
なぜなのか
aptは同時に走らせることはできません。
そもそも何が起きているのかというと、起動した時点でapt-get installが完了していません。
なので時間をかければnodeのバージョンが表示されるようになります。
解決策
そもそもリクエストボディで様々なインストールを行っても起動時にはすべてのパッケージなどがインストールされた状態で起動しません。
なので、Dockerfileに記述して、
FROM ubuntu:latest
# パッケージをインストールし、apt-getプロセスが完了するまで待つ
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN apt-get update && \
apt-get install -y nodejs npm iptables php && \
apt-get install -y ruby && \
apt-get install -y default-jre && \
apt-get install -y python3 && \
npm install -g typescript ts-node
CMD ["bash"]
これを自分オリジナルのUbuntuイメージとしてビルドします。
それをAPIのImageで渡します。
$param = array(
'Image' => 'original_ubuntu'
);
ただし、この方法はローカルでビルドしてください。
以上が解決方法です。
ありがとうございました。