Tengo un archivo docker-compose.yml , y en ese contexto de compilación para un servicio dado con un Dockerfile .
Ejemplo de 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 Puede encontrar el Dockerfile y compilarlo con: docker-compose up --build some-service
Sin embargo, esto fallará. Los argumentos del broker y de la queue nunca se pasan al Dockerfile dado.
Ejemplo de 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"]Como es evidente en la etapa de compilación, estos nunca se analizan:
Step 7/7 : CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker $broker", "--queue $queue"]Luego, el programa Go falla porque los parámetros de la línea de comando no son válidos.
¿Cómo se analizan los argumentos de docker-compose a un Dockerfile ?
Editar: Extrañamente, ¿puedo hacer eco del valor correcto?
Ejemplo:
ARG broker ARG queue RUN echo ${broker}Salidas:
Step 7/8 : RUN echo ${broker} ---> Running in c84828847d9a redis:6379¿Cómo no se analiza esto en el CMD?
Hay dos problemas aquí. ARG solo se usa en tiempo de compilación, cuando se crea la imagen, y CMD define un paso en tiempo de ejecución, cuando se ejecuta su contenedor. ARG se implementa como una variable de entorno para los pasos RUN , por lo que depende del shell expandir la variable de entorno. Y la sintaxis json no ejecuta un shell. Entonces, para hacer esto con CMD , debe realizar dos cambios.
Primero, debe guardar su ARG como un valor ENV que se guarda en los metadatos de la imagen y se usa para configurar el entorno al crear el contenedor.
Y segundo, debe cambiar de una sintaxis exec/json para ejecutar CMD para ejecutar un shell que expandirá estas variables. Docker hace esto por usted con la sintaxis de cadena.
El resultado final se parece a:
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"Aparte, también debe tener en cuenta que cada argumento en la sintaxis exec debe ser una entrada de matriz separada, por ejemplo:
CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker $broker", "--queue $queue"]es similar a ejecutar:
go run /go/src/github.com/org/project/cmd/some-service/some-service.go "--broker $broker" "--queue $queue"cuando realmente querías correr:
CMD ["go", "run", "/go/src/github.com/org/project/cmd/some-service/some-service.go", "--broker", "your_broker", "--queue", "your_queue"]que seria similar a:
go run /go/src/github.com/org/project/cmd/some-service/some-service.go --broker "your_broker" --queue "your_queue"(Tenga en cuenta que eliminé las variables de mi ejemplo porque no funcionan en la sintaxis exec).
Debe configurarlos como ENV , si desea que estén disponibles en contenedores según la imagen (lado de ejecución). Algo como:
ENV broker $broker //assign your env broker value to container ENV queue $queueARG
Estos están disponibles cuando crea la imagen, pero no cuando desea ejecutar un contenedor basado en eso.
ENV
Los valores ENV están disponibles para contenedores y también para comandos de estilo RUN. Si desea que los argumentos estén disponibles durante el tiempo de ejecución , estos son los buenos.
También puede encontrar información útil sobre los valores de env aquí .
Editar. Para evitar el mensaje [Advertencia] Uno o más argumentos de compilación [] no se consumieron , debe hacer algo como:
ARG broker=your.broker.value ENV broker=${broker}El error dice que tiene ARGS sin usar (aunque puede estar bien sin configurarlos ahora que tiene ENV). Más información aquí también.