Использовать существующий 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 шт):
Никак, ибо это идеологически неверно. Образ должен собираться из файлов, лежащих в контексте сборки - каталоге файловой системы, репозитории 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/, который доступен только суперпользователю.