Запустите docker -композитный сервис несколько раз с разными переменными - PullRequest
1 голос
/ 12 марта 2020

У меня есть docker -композиция с сервисом, который я бы хотел запустить несколько раз с различными переменными env. Идея состоит в том, чтобы запустить сервис несколько раз, особенно на нескольких портах.

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

Воспроизводимый пример:

app/app.js

var http = require('http');

var name = process.env.NAME || "Jack"
var port = process.env.PORT || 1234

var server = http.createServer(function(req, res) {
    res.writeHead(200);
    res.end(`Hi ${name}!`);
});
server.listen(port, () => console.log(`Running on port ${port}`));

app/Dockerfile

FROM node:10

WORKDIR /usr/src/app

COPY . .

CMD [ "node", "app.js" ]

docker-compose.yml

version: '2'

services:
    node:
        build: app
        environment:
            - NAME=${NAME}
            - PORT=${PORT}
        command: node app.js
        expose:
            - "${PORT}"
        ports:
            - "${PORT}:${PORT}"

Я хочу уметь:

  • NAME=joe PORT=1234 docker-compose up -d node
  • NAME=jack PORT=1235 docker-compose up -d node

И теперь у меня есть две службы, по одному на каждый порт. localhost: 1234 показать "привет, Джо", localhost: 1235 "Hello jack". Прямо сейчас, если я сделаю это, тот же сервис перезапустится.

Вещи, которые я пробовал до сих пор:

  • Опции --scale, к сожалению, я не смог найти, как управлять настройками env var
  • Использование container_name запись в определении сервиса. К сожалению, похоже, что это все тот же сервис, запущенный и переименованный

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Если вы можете запустить все контейнеры в одном и том же файле docker-compose.yml, тогда вы можете урезать пару параметров, чтобы сделать количество синтаксиса более приемлемым.

Нет конкретного требования c, что процесс внутри контейнера прослушивает тот же порт, который публикуется на хосте, а в современном Docker expose: почти ничего не значит. Это означает, что вам не нужно специально настраивать переменную окружения PORT; вы всегда можете запустить контейнерный процесс на порте по умолчанию 1234 и просто переназначить этот контейнер. Вам также не нужно повторять значение по умолчанию CMD из Dockerfile.

Так что комплексная настройка Docker Compose для того, что вы показываете, может выглядеть как

version: '3' # 2 vs. 3 doesn't really matter here
services:
  joe:
    build: app
    environment:
      - NAME=joe
    ports: '1234:1234'
  jack:
    build: app
    environment:
      - NAME=jack
    ports: '1235:1234'

Если вы хотите использовать серию вызовов docker-compose, как вы показали, у Compose есть внутреннее понятие «проект», и он отслеживает состояние контейнеров в проекте. По умолчанию в качестве имени проекта используется локальное имя текущего каталога. В вашей команде docker-compose up Compose видит, что вы изменили параметры сопоставления портов и среды для контейнера node в том же единственном проекте, поэтому он заменяет существующий контейнер.

Чтобы указать Compose, что там это разные проекты, вам нужна опция docker-compose -p

NAME=joe PORT=1234 docker-compose -p joe up -d node
NAME=jack PORT=1235 docker-compose -p jack up -d node

Обратите внимание, что вам нужно будет повторять эту опцию при каждый docker-compose вызов команды. Если вы используете не-Compose команды, такие как docker ps, вы сможете увидеть имя проекта, включенное как часть имени контейнера (joe_node_1, jack_node_1).

0 голосов
/ 12 марта 2020

https://docs.docker.com/compose/environment-variables/

Поскольку вы видите упомянутую ссылку, которую вам нужно создать, вам нужно иметь файл .env на том же уровне, что и ваш файл компоновки.

Теперь чтобы запустить один и тот же файл составления несколько раз без изменения параметров, вручную создайте файл примера, скажем, sample_file с переменной env в качестве значения ключа, например «Key1 = value_1» «key2 = value_2» Теперь используйте sed для замены value_1 и value_2 и создания нового файла с .env и передайте команду с помощью docker compose up -d

"sed -i -e 's / value_1 / 1234 / g' -e 's / value_2 / Joe / g' sample_file> sample_file.env | docker -создать up -d узел "

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