Я новичок в Docker и Singularity. Недавно я создал канонический main.c
.
#include <stdio.h>
#include <stdlib.h>
int main(void){
printf("Hello Docker World!\n");
return 0;
}
Я статически скомпилировал этот код, т.е.
gcc -static -static-libgcc -static-libstdc++ -o hello main.c
Затем я создал образ докера и смог запустить его, т.е.
dockerd & ## Start Docker daemon
docker build --tag hello .
docker run hello ## Outputs "Hello Docker World"
Затем я спасти образ, чтобы экспортировать его на второй компьютер (на котором нет докера, но есть особенность), т.е.
docker save hello > hello.tar
Теперь на второй машине, на которой нет докера, но есть сингулярность, я хочу создать образ сингулярности. Особенность документация дает инструкции по созданию образа сингулярности из образа докера в Docker Hub, но не дает инструкций по преобразованию из tar'd файла докера.
Вопрос: Как мне создать образ сингулярности из моего hello.tar
?
У меня есть код, который я не хочу публиковать.
Затем создайте локальную регистрацию докеров и отправьте образ в локальный реестр. Используйте это для необычности.
Вторая машина - CentOS 6.9. Не похоже, что это поддерживается Docker (success.docker.com/article/compatibility-matrix). Раньше я пытался установить докер на этот компьютер, но не смог получить рабочую версию.
В этом случае вы должны использовать экспорт сингулярности на своем первом компьютере и импорт на другом.
Используйте контейнер локального реестра, как показано ниже:
# Start a docker registry
$ docker run -d -p 5000:5000 --restart=always --name registry registry:2
# Push local docker container to it
$ docker tag alpine localhost:5000/alpine
$ docker push localhost:5000/alpine
# Create def file for singularity like this..
# (add your modifications)
Bootstrap: docker
Registry: http://localhost:5000
Namespace:
From: alpine:latest
# Build singularity container
$ sudo SINGULARITY_NOHTTPS=1 singularity build alpine.simg def
Сначала сохраните образ докера.
sudo docker save image_id -o local.tar
Затем скопируйте на другую машину любым удобным для вас способом
Наконец, создайте образ сингулярности из local.tar
с помощью
singularity build local_tar.sif docker-archive://local.tar
который использовал агент начальной загрузки docker-archive. Можете прочитать здесь
Как я могу это сделать, если у меня нет доступа к докеру на машине на шаге 3?
Я получаю ERROR: Unknown container build Singularity recipe format: docker-archive://local.tar ABORT: Aborting with RETVAL=255
получение той же ошибки, что и @eric_kernfeld
@RuolinLiu Я пробовал выполнить преобразование тем же способом, который, как вы упомянули, также есть на официальном сайте Singularity. Но проблема, с которой я сталкиваюсь, заключается в том, что преобразованный образ довольно мал по сравнению с исходным изображением (примерно 1/3), что заставляет меня полагать, что сборка пропускает все пакеты (возможно, пользовательские) в исходном образе докера. У вас есть идеи относительно того, что здесь происходит?
Попробуй это. singularity build local_tar.sif local.tar
У меня работает.
Ответ Руолина Лю - это то, что я бы порекомендовал попробовать в первую очередь.
Еще вы можете попробовать инструмент docker2singularity. docker2singularity сам по себе является образом докера, поэтому его легко установить. Кроме того, он предлагает поддержку как текущей, так и более старой версии сингулярности.
В качестве пример о том, как использовать docker2singularity в вашем образе докера hello
, вы должны ...
создать каталог для записи файла изображения сингулярности в
mkdir -p /tmp/test
используйте docker2singularity в образе докера hello
и смонтируйте /tmp/test
в качестве выходного каталога
docker run -v /var/run/docker.sock:/var/run/docker.sock \
-v /tmp/test:/output \
--privileged -t --rm \
quay.io/singularity/docker2singularity \
hello
переместите созданный файл образа сингулярности с /tmp/test
на хост с сингулярностью и запустите его
почему бы не опубликовать его в dockerhub и не использовать?