Как получить файл из контейнера Docker? - PullRequest
2 голосов
/ 27 июня 2019

У меня есть простой Dockerfile, который создает zip-файл, и я пытаюсь получить zip-файл, как только он будет готов. Мой Dockerfile выглядит так:

FROM ubuntu

RUN apt-get update && apt-get install -y build-essentials gcc

ENTRYPOINT ["zip","-r","-9"]
CMD ["/lib64.zip", "/lib64"]

После прочтения документации я чувствую, что что-то вроде этого должно быть, но я не могу заставить его работать.

docker build -t ubuntu-libs .
docker run -d --name ubuntu-libs --mount source=$(pwd)/,target=/lib64.zip ubuntu-libs

Еще один вопрос: можно ли переименовать файл zip из командной строки?

Edit:

Это отличается от дублирующего вопроса , упомянутого в комментариях, потому что пока они используют cp для копирования файла из работающего контейнера Docker, я пытаюсь смонтировать каталог при создании экземпляра.

Ответы [ 2 ]

3 голосов
/ 27 июня 2019

Есть несколько способов сделать это.

Использование докера cp:

docker cp <container_hash>:/path/to/zip/file.zip /path/on/host/new_name.zip

Использование томов докера:

Как вы указали в своем вопросе, вы также можете смонтировать путь от контейнера до вашего хоста. Вы можете сделать это, указав, где на хосте вы хотите, чтобы точка монтирования была, или не указав, где находится точка монтирования, и разрешите docker выбирать. Оба эти пути требуют разных подходов.

Пусть docker выбирает место для монтирования хоста

docker volume create random_volume_name
docker run -d --name ubuntu-libs -v random_volume_name:<path/to/mount/in/container> ubuntu-libs

Контент будет находиться на вашем хосте, здесь:

ls -l /var/lib/docker/volumes/random_volume_name/_data/ 

Позвольте мне выбрать место установки хоста

docker run -d --name ubuntu-libs -v <existing/mount/point/on/host>:<path/to/mount/in/container> ubuntu-libs

Это создает чистое / пустое местоположение, которое используется совместно в соответствии с местоположениями, определенными в команде. Теперь вам нужно изменить ваш Dockerfile, чтобы скопировать артефакты в этот путь, например:

FROM ubuntu

RUN apt-get update && apt-get install -y build-essentials gcc

ENTRYPOINT ["zip","-r","-9"]
CMD ["sh", "-c", "/lib64.zip", "/lib64", "cp", "path/to/zip/file.zip", "<path/to/mount/in/container>"]

Контент теперь будет находиться на вашем хосте, здесь:

ls -l <existing/mount/point/on/host>

Я должен крикнуть @joaofnfernandes из здесь , который отлично объясняет.

1 голос
/ 28 июня 2019

Как прокомментировал @ flagg19, вы должны привязывать каталог к ​​каталогу.Вы можете создать каталоги внутри контейнера и переопределить аргументы RUN.Выполнение обоих с добавлением type=bind приводит к большому успеху:

docker run -d --rm --mount type=bind,source="$(pwd)",target=/out ubuntu-libs /out/lib64.zip /lib64

Или, конечно, вы можете изменить команду Dockerfile RUN, чтобы она записывала в /out/lib64.zip вместо /lib64.zip:

FROM ubuntu

RUN apt-get update && apt-get install -y build-essentials gcc && mkdir /out

ENTRYPOINT ["zip","-r","-9"]
CMD ["/out/lib64.zip", "/lib64"]
docker run -d --rm --mount type=bind,source="$(pwd)",target=/out ubuntu-libs

В любом случае, я рекомендую добавить --rm и избавиться от --name.Не нужно держаться вокруг контейнера после того, как это сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...