Как правильно скопировать файл в Docker-Image?
От: DreamWeaver ОАЭ  
Дата: 05.07.23 16:35
Оценка:
Работаю над ApiGateway для своей системы. Использую для этого Envoy. Нужно получить Docker-Image, который потом запускается в Kubernetes.
Все работает нормально через docker-compose до тех пор пока использую Volume:
Dockerfile:
FROM envoyproxy/envoy:v1.26.2
COPY envoy.yaml /etc/envoy/envoy.yaml

docker-compose:
services:
  ts-gateway:
    image: radiksalakhov/ts-gateway:latest
    build:
      context: .
      dockerfile: ApiGateways/Envoy/Dockerfile
    ports:
      - "9901:9901"
      - "10000:10000"
    volumes:
      - ./ApiGateways/Envoy/envoy.yaml:/etc/envoy/envoy.yaml
    depends_on:
      - ts-rabbitmq


Проблема возникает при попытке запустить все в Kubernetes. Выдается обшибка "Unable to convert YAML as JSON: test". Это происходит из-за того, что Docker-Image "ts-gateway" содержит default файл envoy.yaml, в котором просто написано слово "test".
Аналогичная ошибка возникает если не использовать Volume в docker-compose
По сути нужно сделать Docker-Image для Envoy, который бы уже содержал правильный envoy.yaml.
Не подскажите как это сделать? Вроде задача простая, но нагуглить никак не могу. Понял только, что Docker как-то хитро при запуске контейнера перезаписывает мой файл на default-файл.
Спасибо.
В сложившихся условиях ни то, ни другое не сулило ему никакой выгоды. Чего не скажешь о молчании...
Re: Как правильно скопировать файл в Docker-Image?
От: vsb Казахстан  
Дата: 05.07.23 16:44
Оценка:
Я ничего не понял. Чтобы скопировать файл при построении образа, надо использовать команду COPY. Что ты и написал. То, что ты в докер композе написал — не копирует файл в образ. Эта команда монтирует файл в запущенный контейнер.

Немного ликбеза, чтобы использовать общую терминологию.

Образ это корневая система в определённом формате.

Контейнер это изолированный набор процессов (в каком-то приближении его можно назвать виртуальной машиной). У контейнера есть образ — это его начальная корневая система, которая при запуске "копируется". В процессе работы контейнер может изменять файлы в своей корневой системе, на исходный образ это никак не влияет.

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

Если отвечать на вопрос без изысков, то аналог данной конструкции в kubernetes это configmap. Создаёте configmap и так же монтируете его в pod. Содержимое configmap-а будет видно в запущенном контейнере.

Но наверное можно просто собрать образ с нужным конфигом? Т.е. в момент, когда собирается образ по указанному в начале сообщения докерфайлу, положить envoy.yaml с нужным содержимым.
Отредактировано 05.07.2023 16:46 vsb . Предыдущая версия .
Re[2]: Как правильно скопировать файл в Docker-Image?
От: DreamWeaver ОАЭ  
Дата: 05.07.23 17:41
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Я ничего не понял. Чтобы скопировать файл при построении образа, надо использовать команду COPY. Что ты и написал. То, что ты в докер композе написал — не копирует файл в образ. Эта команда монтирует файл в запущенный контейнер.


vsb>Немного ликбеза, чтобы использовать общую терминологию.


vsb>Образ это корневая система в определённом формате.


vsb>Контейнер это изолированный набор процессов (в каком-то приближении его можно назвать виртуальной машиной). У контейнера есть образ — это его начальная корневая система, которая при запуске "копируется". В процессе работы контейнер может изменять файлы в своей корневой системе, на исходный образ это никак не влияет.


vsb>При запуске контейнера в докере в его корневую систему можно монтировать что-то. К примеру в указанном примере в его корневую систему монтируется файл из хостовой системы. Вообще обычно рекомендуют монтировать каталоги, с файлами там есть нюансы. Но в принципе можно и файлы. Опять же на образ это никак не влияет.


vsb>Если отвечать на вопрос без изысков, то аналог данной конструкции в kubernetes это configmap. Создаёте configmap и так же монтируете его в pod. Содержимое configmap-а будет видно в запущенном контейнере.


vsb>Но наверное можно просто собрать образ с нужным конфигом? Т.е. в момент, когда собирается образ по указанному в начале сообщения докерфайлу, положить envoy.yaml с нужным содержимым.


Спасибо. Проблема оказалась банальной . Рядом с docker-compose лежал непонятно откуда взявшийся файл "envoy.yaml", который просто содержал слово "test".
Он то и копировался в Image после выполнения команды "docker-compose build".
После исправления Docker файла с
COPY envoy.yaml /etc/envoy/envoy.yaml

на
COPY ["ApiGateways/Envoy/envoy.yaml", "/etc/envoy/envoy.yaml"]

все заработало
В сложившихся условиях ни то, ни другое не сулило ему никакой выгоды. Чего не скажешь о молчании...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.