はじめに
本記事では、コンテナからイメージを生成する方法についてまとめます。
コンテナの作成
今回は簡単なコンテナとして、c++のhello worldプログラムを使います。
ディレクトリ構成は以下のようにします。
docker-cpp/
├ src/
├ CMakeLsits.txt
└ main.py
├ docker-compose.yml
└ Dockerfile
各ファイルの内容は以下のようになります。
FROM ubuntu:18.04
RUN apt-get update && apt-get -y upgrade && \
apt-get install -y sudo && \
apt-get install -y build-essential && \
apt-get install -y vim && \
apt-get install -y wget && \
apt-get install -y unzip && \
apt-get install -y git && \
apt-get install -y libssl-dev
# コンパイラーのインストール
RUN apt-get install -y gcc && \
apt-get install -y g++
# コンパイラーのパスをセット
ENV CC=/usr/bin/gcc \
CXX=/usr/bin/g++
# CMakeインストール
RUN cd $HOME && \
wget https://github.com/Kitware/CMake/releases/download/v3.17.1/cmake-3.17.1.tar.gz && \
tar zxvf cmake-3.17.1.tar.gz && \
cd cmake-3.17.1/ && \
./bootstrap && \
make -j12 && sudo make install -j8
RUN echo 'export PATH=$HOME/cmake-3.17.1/bin/:$PATH' >> ~/.bashrc && \
. ~/.bashrc
RUN apt-get install -y libopenblas-dev && \
apt-get install -y liblapack-dev
# ライブラリインストール用ディレクトリ
WORKDIR $HOME/usr/
RUN mkdir ./library
CMD bash
version: '3'
services:
cmake:
container_name: cmake_container
build:
context: .
dockerfile: Dockerfile
tty: true
command: /bin/bash
volumes:
- ./src:/usr/src
project("testDockerCpp")
cmake_minimum_required(VERSION 2.8)
add_executable(test main.cpp)
#include <iostream>
#include <string>
int main(void){
std::cout << "Hello World!" << std::endl;
return 0;
}
コンテナの作成
上記のファイルが準備できたら、コンテナを作成していきます。以下のコマンドでDockerfileをビルドし、コンテナを作成します。
docker compose up -d
コンテナが起動できたら、以下のコマンドでコンテナ内に入ります。
docker exec -it cmake_container bash
コンテナ内に入ったら以下のコマンドでビルド、実行をするとHello World!と出力されます。
cd /usr/src/
mkdir build
cd build
cmake .. & make -j4
./test
このあとこのコンテナをイメージ化するのですが、このままイメージ化しても意味がないので(コンテナ作成時に作られているので)、少しいじってみます。今回は、ソースコードを消して実行ファイルのみにしてみます。
cd /usr/src
rm main.py CMakeLists.txt
コンテナをイメージ化
いよいよコンテナをイメージ化していきます。イメージ化する前にコンテナは以下のコマンドで停止しておいてください。
exit
docker stop cmake_container
以下のコマンドを実行することで、コンテナをイメージ化することができます。
docker commit コンテナ名 イメージ名
docker commit cmake_container helloworld
ここで、イメージ名はアルファベット小文字のみでないとエラーになります。
以下のコマンドで、今作成したイメージからコンテナを作ってみます。
docker run -itd --name helloworld_container helloworld
コンテナ内に入って、./test
を実行するとHello World!
と表示されます。
docker exec -it helloworld_container bash
cd /usr/src/build
./test
最後に
なんで、c++を例に使ったんだろう。Dockerfileのビルドめちゃくちゃ時間かかります。ごめんなさい。作成ずみのコンテナ使うと、さくっと試せると思います。(そもそも配布イメージ使えばよかった)