Использовать существующий Volume для сборки нового image в Dockerfile

Для сбора C++ программы используется контейнер с подключённым Volume. После его работы остается бинарник программы на этом Volume. Мне нужно использовать этот бинарник для создания нового image.

Если скопировать бинарник из Volume и положить в одну папку с Dockerfile бинарник это GidUralClient то можно собрать новый image.

FROM centos:7

RUN yum update -y \
 && yum install -y \
      gcc \
      wget \
      make \
      perl-core \
      zlib-devel

 
#openssl

RUN wget https://ftp.openssl.org/source/openssl-1.1.1k.tar.gz \
 && tar xf openssl*.gz \
 && cd openssl* \
 && ./config --prefix=/usr --openssldir=/etc/ssl zlib-dynamic \
 && make -j$(nproc) \
 && make install
  
COPY librdkafka.so.1 /usr/local/lib/
COPY librdkafka++.so.1 /usr/local/lib/
COPY GidUralClient /app/

RUN chmod +x ./app/GidUralClient 

Пытаюсь использовать Volume при сборке, но файл ./app/GidUralClient не видит.

FROM centos:7

VOLUME /app/

RUN yum update -y \
 && yum install -y \
      gcc \
      wget \
      make \
      perl-core \
      zlib-devel

 
#openssl

RUN wget https://ftp.openssl.org/source/openssl-1.1.1k.tar.gz \
 && tar xf openssl*.gz \
 && cd openssl* \
 && ./config --prefix=/usr --openssldir=/etc/ssl zlib-dynamic \
 && make -j$(nproc) \
 && make install
  
COPY librdkafka.so.1 /usr/local/lib/
COPY librdkafka++.so.1 /usr/local/lib/


RUN chmod +x ./app/GidUralClient 

docker-compose

version: '3'
services:

  gidural-client:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: gidural-c-light
    volumes:
      - docker-build_gidUralClient-build-data:./app/

volumes:
  docker-build_gidUralClient-build-data:
    external: true

Подскажите как использовать данные из существующего Volume для создания image?


Ответы (1 шт):

Автор решения: Pak Uula

Никак, ибо это идеологически неверно. Образ должен собираться из файлов, лежащих в контексте сборки - каталоге файловой системы, репозитории git или архиве tar. Монтирование дополнительных хранилищ в этой идеологии не допускается.

Если вы хотите переиспользовать какой-то бинарник, получившийся при работе другого докера, то выньте его из тома и положите его в контекст сборки. Каталог файловой системы хоста, в котором лежит содежимое тома Volume, возвращает команда

docker volume inspect Volume -f '{{.Mountpoint}}'

Скопировать файл:

sudo cp $(docker volume inspect Volume -f '{{.Mountpoint}}')/path/to/file <context>/some/path

Нужно sudo, так как, вероятнее всего, Volume лежит где-нибудь внутри каталога /var/lib/docker/, который доступен только суперпользователю.

→ Ссылка