Здесь есть две проблемы. 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.)