Работаю над 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-файл.
Спасибо.
В сложившихся условиях ни то, ни другое не сулило ему никакой выгоды. Чего не скажешь о молчании...
Я ничего не понял. Чтобы скопировать файл при построении образа, надо использовать команду COPY. Что ты и написал. То, что ты в докер композе написал — не копирует файл в образ. Эта команда монтирует файл в запущенный контейнер.
Немного ликбеза, чтобы использовать общую терминологию.
Образ это корневая система в определённом формате.
Контейнер это изолированный набор процессов (в каком-то приближении его можно назвать виртуальной машиной). У контейнера есть образ — это его начальная корневая система, которая при запуске "копируется". В процессе работы контейнер может изменять файлы в своей корневой системе, на исходный образ это никак не влияет.
При запуске контейнера в докере в его корневую систему можно монтировать что-то. К примеру в указанном примере в его корневую систему монтируется файл из хостовой системы. Вообще обычно рекомендуют монтировать каталоги, с файлами там есть нюансы. Но в принципе можно и файлы. Опять же на образ это никак не влияет.
Если отвечать на вопрос без изысков, то аналог данной конструкции в kubernetes это configmap. Создаёте configmap и так же монтируете его в pod. Содержимое configmap-а будет видно в запущенном контейнере.
Но наверное можно просто собрать образ с нужным конфигом? Т.е. в момент, когда собирается образ по указанному в начале сообщения докерфайлу, положить envoy.yaml с нужным содержимым.
Здравствуйте, 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"]
все заработало
В сложившихся условиях ни то, ни другое не сулило ему никакой выгоды. Чего не скажешь о молчании...