Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

381
Views
Los argumentos de composición de Docker no se pasan a Dockerfile

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?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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).

over 4 years ago · Santiago Trujillo Report

0

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 $queue

ARG

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!