C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП Docker рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдпрд╣ рдкреЛрд╕реНрдЯ рдбреЙрдХрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ GTest рдФрд░ Boost рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдЧреАред рд▓реЗрдЦ рдХреБрдЫ рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдиреБрд╕реНрдЦрд╛ рд╣реИ, рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рд╕рдорд╛рдзрд╛рди рдЙрддреНрдкрд╛рджрди-рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХрд╛ рдирд╛рдЯрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдХреНрдпреЛрдВ рдФрд░ рдХрд┐рд╕реЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ?


рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк, рдореЗрд░реА рддрд░рд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рдпрдерди рд╡реЗрдирд╡ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рддрд░рд╣ рд╣реИрдВ, рдЬрдм рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛ рдПрдХ рдЕрд▓рдЧ, рд╕рдЦреНрддреА рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ; рдпрд╛ рдЖрдкрдХреЛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рддрд╣рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рд╕рд░рд▓ рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЯреАрдо рдореЗрдВ рдПрдХ рдирдпрд╛ рдбреЗрд╡рд▓рдкрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛред


рдпрд╣ рдЖрд▓реЗрдЦ рдЙрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдбреЙрдХрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдЖрдкрдХреЛ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдбреЙрдХрд░ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕реЗрд╕ рд╣реИред


рдбреЙрдХрд░ рд╡рд┐рдВрдбреЛрдЬ, рд▓рд┐рдирдХреНрд╕ рдФрд░ рдореИрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ ред


рдЪреВрдВрдХрд┐ рдореИрдВ рдмреЛрд░реНрдб рдкрд░ рдПрдХ рд╡рд┐рдВрдбреЛрдЬ рдорд╢реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдмрд╕ рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред


рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рд╕рдордп, рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдбреЙрдХрд░ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрдкрд░-рд╡реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рдкрд░рд┐рдпреЛрдЬрдирд╛


рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рдХрдорд╛рдВрдбрд▓рд╛рдЗрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЕрд░реНрде рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб!" рдорд╛рдирдХ рдЙрддреНрдкрд╛рджрди рдзрд╛рд░рд╛ рдХреЗ рд▓рд┐рдПред


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рд╕рд╛рде рд╣реА рд╕реАрдПрдордХреЗ рдХреЛ рдПрдХ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧреАред


рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧреА:


project | Dockerfile | \---src CMakeLists.txt main.cpp sample_hello_world.h test.cpp 

CMakeLists.txt рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб:


 cmake_minimum_required(VERSION 3.2) project(HelloWorldProject) #  C++17 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") #  Boost.Program_options #   ,     set(Boost_USE_STATIC_LIBS ON) find_package(Boost COMPONENTS program_options REQUIRED) include_directories(${BOOST_INCLUDE_DIRS}) #     add_executable(hello_world_app main.cpp sample_hello_world.h) target_link_libraries(hello_world_app ${Boost_LIBRARIES}) #  CTest enable_testing() #       GoogleTest find_package(GTest REQUIRED) include_directories(${GTEST_INCLUDE_DIRS}) #    add_executable(hello_world_test test.cpp sample_hello_world.h) target_link_libraries(hello_world_test ${GTEST_LIBRARIES} pthread) #       CTest add_test(NAME HelloWorldTest COMMAND hello_world_test) 

рдирдореВрдирд╛_рд╣реЗрд▓реЛ_рд╡рд░реНрд▓реНрдб.рд╣ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИрд▓реЛрд╡рд░реНрд▓реНрдб рдХреНрд▓рд╛рд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рднреЗрдЬрддреЗ рд╣реБрдП, рд╕реНрдЯреНрд░рд┐рдВрдЧ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб!" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЬрдЯрд┐рд▓рддрд╛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИред
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб:


 #ifndef SAMPLE_HELLO_WORLD_H #define SAMPLE_HELLO_WORLD_H namespace sample { struct HelloWorld { template<class OS> friend OS& operator<<(OS& os, const HelloWorld&) { os << "Hello World!"; return os; } }; } // sample #endif // SAMPLE_HELLO_WORLD_H 

Main.cpp рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИ, рд╣рдо рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Boost.Program_options рднреА рдЬреЛрдбрд╝реЗрдВрдЧреЗред


рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб:


 #include "sample_hello_world.h" #include <boost/program_options.hpp> #include <iostream> //         - "--help" auto parseArgs(int argc, char* argv[]) { namespace po = boost::program_options; po::options_description desc("Allowed options"); desc.add_options() ("help,h", "Produce this message"); auto parsed = po::command_line_parser(argc, argv) .options(desc) .allow_unregistered() .run(); po::variables_map vm; po::store(parsed, vm); po::notify(vm); //  C++17     std::make_pair return std::pair(vm, desc); } int main(int argc, char* argv[]) try { auto [vm, desc] = parseArgs(argc, argv); if (vm.count("help")) { std::cout << desc << std::endl; return 0; } std::cout << sample::HelloWorld{} << std::endl; return 0; } catch (std::exception& e) { std::cerr << "Unhandled exception: " << e.what() << std::endl; return -1; } 

Test.cpp рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо - HelloWorld рд╡рд░реНрдЧ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдорд┐рд▓ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╣рдо GoogleTest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб:


 #include "sample_hello_world.h" #include <sstream> #include <gtest/gtest.h> //  ,  HelloWorld  ,     TEST(HelloWorld, Test) { std::ostringstream oss; oss << sample::HelloWorld{}; ASSERT_EQ("Hello World!", oss.str()); } //      int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } 

рдЕрдЧрд▓рд╛, рдЪрд▓реЛ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рднрд╛рдЧ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ - рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдмрд┐рд▓реНрдб рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░реЗрдВ!


Dockerfile


рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рд╣рдо рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ gcc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
Dockerfile рдореЗрдВ рджреЛ рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ: рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛ рдФрд░ рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ред
рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдмрдВрдЯреВ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


рдбреЙрдХрдлрд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА:


 #  --------------------------------------- #        gcc:latest FROM gcc:latest as build #      GoogleTest WORKDIR /gtest_build #        GoogleTest #     ,  # Docker   RUN   , #   ,   ,   RUN apt-get update && \ apt-get install -y \ libboost-dev libboost-program-options-dev \ libgtest-dev \ cmake \ && \ cmake -DCMAKE_BUILD_TYPE=Release /usr/src/gtest && \ cmake --build . && \ mv lib*.a /usr/lib #   /src   ADD ./src /app/src #       WORKDIR /app/build #    ,     RUN cmake ../src && \ cmake --build . && \ CTEST_OUTPUT_ON_FAILURE=TRUE cmake --build . --target test #  --------------------------------------- #      ubuntu:latest FROM ubuntu:latest #  ,    Docker    root #     root'  :) RUN groupadd -r sample && useradd -r -g sample sample USER sample #      WORKDIR /app #         COPY --from=build /app/build/hello_world_app . #    ENTRYPOINT ["./hello_world_app"] 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрд╡реЗрджрди рдмрдирд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдУ!


рдЕрд╕реЗрдВрдмрд▓реА рдФрд░ рд▓реЙрдиреНрдЪ


рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдбреЙрдХрдЯрд░ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛:


 #  docker-cpp-sample    # . -    ,  Dockerfile docker build -t docker-cpp-sample . 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:


 > docker run docker-cpp-sample 

рд╣рдо рдкреЛрд╖рд┐рдд рд╢рдмреНрдж рджреЗрдЦреЗрдВрдЧреЗ:


 Hello World! 

рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЙрдкрд░реЛрдХреНрдд рдХрдорд╛рдВрдб рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛:


 > docker run docker-cpp-sample --help Allowed options: -h [ --help ] Produce this message 

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЗрдирд╛


рдирддреАрдЬрддрди, рд╣рдордиреЗ рдПрдХ рдкреВрд░реНрдг рд╕реА + + рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛, рдЗрд╕реЗ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛, рдФрд░ рдЗрд╕реЗ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд▓рдкреЗрдЯ рджрд┐рдпрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмрд╛рдж рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдореБрдХреНрдд рдХрд░рдирд╛ред

Source: https://habr.com/ru/post/hi414109/


All Articles