Dockerfile の作り方
基本的に前回の記事を Dockerfile に落とし込むだけ。
記事からの変更点は以下の通り。
- ダウンロードする場所を最初から
/
にした
cd
は、 RUN
ではなくて Dockerfile の WORKDIR
コマンドで行う。
実行環境の構築
追加の作業として、ビルドした成果物のバイナリとライブラリのみを実行用環境にコピーする。
こうすることで、実行環境のコンテナイメージのサイズ削減ができる
使用ライブラリの特定
ldd
を使って、各バイナリがどのライブラリを使用しているか確認する。
# ldd /usr/local/bin/* | grep ".so" | cut -d '(' -f -1 | sort -u
/lib64/ld-linux-x86-64.so.2
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6
linux-vdso.so.1
# ldd /lib64/ld-linux-x86-64.so.2 /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libdl.so.2 /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib/x86_64-linux-gnu/libm.so.6 /lib/x86_64-linux-gnu/libstdc++.so.6 | grep ".so" | cut -d '(' -f -1 | sort -u
/lib64/ld-linux-x86-64.so.2
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6
linux-vdso.so.1
ということで、この辺があれば良さそう。
- /lib64/ld-linux-x86-64.so.2
- /lib/x86_64-linux-gnu/libc.so.6
- /lib/x86_64-linux-gnu/libdl.so.2
- /lib/x86_64-linux-gnu/libgcc_s.so.1
- /lib/x86_64-linux-gnu/libm.so.6
- /lib/x86_64-linux-gnu/libstdc++.so.6
buster-slim
には全部入っている。
完成した Dockerfile
# ビルド環境を構築してビルド
FROM debian:buster-slim as build-env
LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version="v14.01"
LABEL description "Runesas V850 Toolchain v14.01(fromhttps://gcc-renesas.com/ja/v850/v850-download-toolchains/)"
RUN apt-get update \
&& apt-get -y install \
build-essential \
libgmp-dev \
libmpfr-dev \
libmpc-dev \
texinfo \
wget \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# ツールチェインのソース取得
WORKDIR /
RUN wget https://gcc-renesas.com/downloads/d.php?f=v850/binutils/14.01/binutils-2.24_v850_v14.01.tar.bz2 -O binutils-2.24_v850_v14.01.tar.bz2
RUN tar xf binutils-2.24_v850_v14.01.tar.bz2
RUN wget https://gcc-renesas.com/downloads/d.php?f=v850/gcc/14.01/gcc-4.9.2_v850_v14.01.tar.bz2 -O gcc-4.9.2_v850_v14.01.tar.bz2
RUN tar xf gcc-4.9.2_v850_v14.01.tar.bz2
RUN wget https://gcc-renesas.com/downloads/d.php?f=v850/newlib/14.01/newlib-2.1.0_v850_v14.01.tar.bz2 -O newlib-2.1.0_v850_v14.01.tar.bz2
RUN tar xf newlib-2.1.0_v850_v14.01.tar.bz2
# binutils のビルド
RUN mkdir -p /build/binutils
WORKDIR /build/binutils
RUN ../../binutils-2.24/configure --target=v850-elf --prefix=/usr/local --enable-soft-float
RUN make CFLAGS="-Wno-cast-function-type -Wno-implicit-fallthrough -Wno-shift-negative-value -Wno-unused-value -Wno-pointer-compare"
RUN make install
# gcc のビルド
RUN mkdir -p /build/gcc
WORKDIR /build/gcc
RUN ../../gcc-4.9.2/configure --target=v850-elf --prefix=/usr/local --enable-languages=c,c++ --disable-nls --disable-multilib --disable-libssp --with-newlib --with-headers=/newlib-2.1.0/newlib/libc/include
RUN make CXXFLAGS="-std=c++03"
RUN make install
# newlib のビルド
RUN mkdir -p /build/newlib
WORKDIR /build/newlib
RUN ../../newlib-2.1.0/configure --target=v850-elf --prefix=/usr/local
RUN make
RUN make install
# 実行環境を構築してビルド環境からバイナリをコピー
FROM debian:buster-slim
LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version="v14.01"
LABEL description "Runesas V850 Toolchain v14.01(fromhttps://gcc-renesas.com/ja/v850/v850-download-toolchains/)"
# build-env から必要なファイルをコピー
COPY --from=build-env \
/usr/local \
/usr/local
# make くらい必要でしょ?
RUN apt-get update \
&& apt-get -y install \
make \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
イメージのビルド
cd /PATH/TO/Dockerfile
docker build -t mikoto2000/v850-toolchain:latest .
動作確認
# cd /athrill/sample/barmetal/step2/
# make clean all
rm -f start.o vector.o training.o main.o test_suite.o test_instruction.o test_main.elf *.map
v850-elf-gcc -c -I. -I../common -I../../../trunk/src/config/target/v850esfk3 -O0 -mdisable -callt -mno-app-regs -mtda=0 -gdwarf-2 -Wall -Wno-unused-label -Wpointer-arith -mv850e2 -Wa,-mno-bcond17 -Wa,-mwarn-signed-overflow -Wa,-mwarn-unsigned-overflow start.S
/usr/local/libexec/gcc/v850-elf/4.9-GNUV850_v14.01/cc1: error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory
make: *** [../build/v850esfk3/Makefile.common:35: start.o] Error 1
おや?ここにも実行ファイルがあったんですね。依存ライブラリ確認。
# cd /usr/local/libexec/gcc/v850-elf/4.9-GNUV850_v14.01/
# ldd cc1 cc1plus coll
ect2 liblto_plugin.so.0.0.0
cc1:
linux-vdso.so.1 (0x00007ffdcfdd8000)
libmpc.so.3 => not found
libmpfr.so.6 => not found
libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007ff060af8000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff060af3000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff060970000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff0607ed000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff0607d1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff060610000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff061877000)
cc1plus:
linux-vdso.so.1 (0x00007ffeb59b3000)
libmpc.so.3 => not found
libmpfr.so.6 => not found
libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f5c57a0d000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5c57a08000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5c57885000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5c57702000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5c576e6000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5c57525000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5c588f6000)
collect2:
linux-vdso.so.1 (0x00007fff6cf2a000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6c99fde000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6c99e5b000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6c99e41000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6c99c80000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6c9a1de000)
liblto_plugin.so.0.0.0:
linux-vdso.so.1 (0x00007ffc407a1000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f92edef9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f92ee0d1000)
これが無い。
- libmpc.so.3 => not found
- libmpfr.so.6 => not found
さっき作ったビルド用コンテナイメージでライブラリの場所を確認して Dockerfile に追加。
COPY --from=build-env \
/usr/lib/x86_64-linux-gnu/libmpc.so.3 \
/usr/lib/x86_64-linux-gnu/libmpc.so.3
COPY --from=build-env \
/usr/lib/x86_64-linux-gnu/libmpfr.so.6 \
/usr/lib/x86_64-linux-gnu/libmpfr.so.6
...gmp はどこいった? 対処療法っぽいけどまぁその辺は後々問題が出たら対応で。
docker イメージを再ビルドする。
動作確認再挑戦
# cd /athrill/sample/barmetal/step2/
# make clean all
OK.
以上。
更新履歴
日付 | 更新内容 |
---|---|
2019/2/9 | 新規作成 |
2019/3/11 | gcc のビルド時、『s/--with-header/--with-headers/ で target-libstdc++-v3 のビルドエラーは解消できる』という指摘を反映 |
いつもありがとうございます。利用させていただきます、
返信削除