
clang ++を使用してC ++アプリケーションを構築するために、小さなアルパインベースのドッカーコンテナを構築しようとしています。Dockerfile
次のようになります。
FROM alpine:3.10
RUN apk add --no-cache clang
しかし、hello worldをコンパイルしようとすると、次のエラーが発生します。
$ printf '#include <iostream>\nint main(){std::cout<<"Hello"<<std::endl;}' > test.cxx
$ clang++ test.cxx -o test
test.cxx:1:10: fatal error: 'iostream' file not found
#include <iostream>
^~~~~~~~~~
1 error generated.
ただし、このコンテナにパッケージを追加すると、g++
この例は期待どおりにコンパイルされ動作します。
このパッケージにはg++
すべてのC ++ヘッダーが含まれているようです。
apk info --who-owns /usr/include/c++/9.2.0/iostream
/usr/include/c++/9.2.0/iostream is owned by g++-9.2.0-r3
g ++をインストールせずにC ++ヘッダファイルをインストールする方法はありますか?私のドッカーイメージを小さく保ち、g ++を維持したいと思い、その依存関係はかなり重いです。
答え1
iostream
残念ながら、g ++は標準のC ++ヘッダファイルを提供する唯一のパッケージです。コンテンツごとに Alpine Linux パッケージ索引を検索して、これを確認できます。
https://pkgs.alpinelinux.org/contents?file=iostream&path=&name=&branch=v3.10&arch=x86_64
ただし、イメージを小さく保つには、次のようにg++
2段階のDockerビルドを使用するか、ビルド後にイメージをスカッシングしてパッケージをインストールし、最終イメージからすべてのg ++実行可能ファイルを削除できます。アルパインの軽量GCC。
/usr/include/c++
デフォルトでは、下にすべての項目を入れる必要があります/usr/lib
。あなたは削除することができますgcc実行可能バイナリダウン/usr/bin
、cc1plus
ダウン/usr/libexec/gcc
。