Dockerfile с нуля с использованием динамической сборки - PullRequest
0 голосов
/ 03 октября 2019

Следующий пост слишком длинный, пожалуйста, наберитесь терпения при прохождении

Привет, я новичок в докере и ддс.

Я создаюпростой код с использованием rti-dds и docker. Код предоставит мне два файла exe, один для публикации данных, а другой для подписки данных.

Я хочу использовать «С нуля» в моем Dockerfile, так как мне не нужны ни bash, ни какие-либо ОС.

Теперь, если я использую FROM scratch, нужно ли мне, чтобы мои exes статически собирались с флагом g ++ -static или это можно было делать динамически, то есть без статического флага.

Какой из них предпочтительнее илиесть ли к нему правило?

Docker Verion

Клиент: Docker Engine - Сообщество
Версия: 19.03.2
Версия API:1.40
Go версия: go1.12.8
Git commit: 6a30dfc
Построен: чт 29 августа 05:29:11 2019
OS / Arch: linux / amd64
Экспериментальный: false

Dockerfile при сборке exe-файлов с флагом -static

FROM scratch

COPY rti_license.dat /
COPY USER_QOS_PROFILES.xml /
COPY /objs/x64Linux3gcc4.8.2/DynamicTest_publisher /
COPY /objs/x64Linux3gcc4.8.2/DynamicTest_subscriber /

CMD ["/DynamicTest_publisher"]

Образ докера успешно собирается и запускается без ошибок

НО

Dockerfile при динамическом построении исполняемых файлов (без статического флага)

вычисление всех зависимостей, которые должны быть скопированы, а также проверка зависимостей с использованием

ldd на exe

FROM scratch

COPY rti_license.dat /
COPY USER_QOS_PROFILES.xml /
COPY /lib/x86_64-linux-gnu/libdl.so.2 /
COPY /lib/x86_64-linux-gnu/libnsl.so.1 /
COPY /lib/x86_64-linux-gnu/libpthread.so.0 /
COPY /lib/x86_64-linux-gnu/librt.so.1 /
COPY /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /
COPY /lib/x86_64-linux-gnu/libc.so.6 /
COPY /lib/x86_64-linux-gnu/libgcc_s.so.1 /
COPY /objs/x64Linux3gcc4.8.2/DynamicTest_publisher /
COPY /objs/x64Linux3gcc4.8.2/DynamicTest_subscriber /
COPY /lib64/ld-linux-x86-64.so.2 /

CMD ["/DynamicTest_publisher"]

Создание образа докера

docker build --tag dynamictest .

Но когда я пытаюсь запустить это, я получаю следующую ошибку

docker run --rm -it dynamictest

Ошибка
standard_init_linux. go: 211: пользовательский процесс exec вызвал «нет такого файла или каталога

Итак, я что-то здесь упускаю или это« ОТ нуля работает только со статическими сборками »

1 Ответ

0 голосов
/ 18 октября 2019

ЭТО РАБОТАЕТ ЛУЧШЕ ДЛЯ МЕНЯ - Динамическая сборка

Самое первое, что нужно было выяснить - все зависимости для вашего exe-файла

    $ldd dytest_publisher

    linux-vdso.so.1 =>  (0x00007ffec3df9000)
    libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007ffb0e740000)
    libnsl.so.1 => /usr/lib64/libnsl.so.1 (0x00007ffb0e526000)
    libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007ffb0e30a000)
    librt.so.1 => /usr/lib64/librt.so.1 (0x00007ffb0e102000)
    libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007ffb0dd28000)
    libm.so.6 => /usr/lib64/libm.so.6 (0x00007ffb0da26000)
    libc.so.6 => /usr/lib64/libc.so.6 (0x00007ffb0d665000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ffb0e945000)
    libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007ffb0d44c000)

Скопируйте вышеуказанные библиотеки вместе со структурой папок в папку вашего проекта и создайте файл Docker с именем Dockerfile

Dockerfile

FROM scratch

COPY rti_license.dat / 
COPY USER_QOS_PROFILES.xml /     
COPY /objs/x64Linux3gcc4.8.2/DynamicTest_publisher /     
COPY /objs/x64Linux3gcc4.8.2/DynamicTest_subscriber /     
COPY /lib64/* /lib64/     
COPY /usr/lib64/* /usr/lib64/      

ENV LD_LIBRARY_PATH=/usr/lib64/:/lib64/     

CMD ["/dytest_publisher"]   

Примечание: папка проекта должна иметь каталог: / usr / lib64 / и / lib64 / вместе со всеми зависимыми библиотеками. Зависимые библиотеки можно проверить с помощью следующей команды:

$ldd "your exe file" 

Создание образа докера

docker build --tag dynamictest .

Запуск созданного образа

docker run --rm -it dynamictest

Чтобы увидеть работающий контейнер

docker container ls

PS: спасибо всем за помощь в этом

...