Аргументы Docker-compose не передаются в Dockerfile - PullRequest
1 голос
/ 11 июня 2019

У меня есть docker-compose.yml файл, и в этом контексте сборки для данной службы с Dockerfile.

Пример docker-compose:

version: '3'

services:

  scd-service:
    build:
      context: ./cmd/some-service/
      dockerfile: Dockerfile
      args:
        broker: redis:6379
        queue: somequeue
    depends_on:
      - redis
    networks:
      - backend

  redis:
    image: "redis:alpine"
    restart: unless-stopped
    networks:
      - backend

Может найтиDockerfile и создайте его с помощью: docker-compose up --build some-service

Однако это не удастся.Аргументы broker и queue никогда не передаются в указанный файл Docker.

Пример Dockerfile:

FROM golang:1.11

// stuff...

ARG broker
ARG queue

CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker $broker", "--queue $queue"]

Как видно на этапе сборки, они никогда не анализируются:

Step 7/7 : CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker $broker", "--queue $queue"]

После чего происходит сбой программы Go, поскольку параметры командной строки являются недопустимыми.

Как анализировать аргументы от docker-compose до Dockerfile?

Редактировать: Странно, я могу отобразить правильное значение?

Пример:

ARG broker
ARG queue

RUN echo ${broker}

Выходы:

Step 7/8 : RUN echo ${broker}
 ---> Running in c84828847d9a
redis:6379

Как это не анализируетсяна CMD?

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

Вы должны установить их как ENV, если вы хотите, чтобы они были доступны для контейнеров на основе образа (на стороне выполнения).Что-то вроде:

ENV broker $broker   //assign your env broker value to container
ENV queue  $queue

ARG

Они доступны при создании образа, но не когда вы хотите запустить контейнер на его основе.

ENV

ENV доступны для контейнеров, а также для команд в стиле RUN.Если вы хотите, чтобы аргументы были доступны во время выполнения , это хорошие.

Вы также можете найти полезную информацию о значениях env здесь .

Edit.Чтобы избежать [Предупреждение] Один или несколько сборочных аргументов [] не были использованы сообщение, вы должны сделать что-то вроде:

ARG broker=your.broker.value
ENV broker=${broker}

Ошибка говорит о том, что вы не использовали ARGS(хотя вы можете быть в порядке, не устанавливая их сейчас, когда у вас есть ENV).Больше информации здесь .

2 голосов
/ 11 июня 2019

Здесь есть две проблемы. ARG используется только во время сборки, при создании образа, а CMD определяет шаг во время выполнения при запуске вашего контейнера. ARG реализуется как переменная среды для шагов RUN, поэтому расширение оболочки зависит от оболочки. И синтаксис JSON не запускает оболочку. Таким образом, чтобы сделать это с CMD, вам нужно внести два изменения.

Сначала вам необходимо сохранить ARG как значение ENV, которое сохраняется в метаданных изображения и используется для настройки среды при создании контейнера.

И, во-вторых, вам нужно переключиться с синтаксиса exec / json для запуска CMD, чтобы запустить оболочку, которая расширит эти переменные. Docker сделает это за вас с помощью строкового синтаксиса.

Конечный результат выглядит так:

FROM golang:1.11

// stuff...

ARG broker
ENV broker=${broker}
ARG queue
ENV queue=${queue}

CMD go run /go/src/github.com/org/project/cmd/some-service/some-service.go --broker "$broker" --queue "$queue"

Кроме того, следует также отметить, что каждый аргумент в синтаксисе exec должен быть отдельной записью массива, например ::

CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker $broker", "--queue $queue"]

похоже на бег:

go run /go/src/github.com/org/project/cmd/some-service/some-service.go "--broker $broker" "--queue $queue"

когда ты действительно хотел бежать:

CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker", "your_broker", "--queue", "your_queue"]

который будет похож на:

go run /go/src/github.com/org/project/cmd/some-service/some-service.go --broker "your_broker" --queue "your_queue"

(Обратите внимание, что я удалил переменные из моего примера, потому что они не работают в синтаксисе exec.)

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