LINUX.ORG.RU
решено ФорумAdmin

Аргумент из .env в Dockerfile

 , , ,


0

3

cat .env

YOUTRACK_VERSION=2020.2.7479
YOUTRACK_CONTEXT=docker/youtrack

cat docker-compose.dev.yml

...(traefik)
youtrack:
    build:
      context:
        ${YOUTRACK_CONTEXT}
      args:
        YOUTRACK_VERSION: ${YOUTRACK_VERSION}
    # image: jetbrains/youtrack:2020.2.7479
    container_name: "youtrack"
    volumes:
      - ./srv/youtrack/data:/opt/youtrack/data
      - ./srv/youtrack/conf:/opt/youtrack/conf
      - ./srv/youtrack/logs:/opt/youtrack/logs
      - ./srv/youtrack/backups:/opt/youtrack/backups
      - ./ssl/:/srv/letsencrypt
    labels:
      - "traefik.enable=true"
      - "traefik.http.services.youtrack.loadbalancer.server.port=8080"
      - "traefik.http.routers.youtrack.rule=Host(`${VIRTUAL_HOST}`)"
      - "traefik.http.routers.youtrack.entrypoints=websecure"
      - "traefik.http.routers.youtrack.tls.certresolver=myresolver"
    environment:
      YOUTRACK_VERSION: ${YOUTRACK_VERSION}
    env_file:
      - .env

cat docker/youtrack/Dockerfile

ARG YOUTRACK_VERSION
FROM jetbrains/youtrack:${YOUTRACK_VERSION}
...

$docker-compose up -d --build --force-recreate out:

- InvalidDefaultArgInFrom: Default value for ARG jetbrains/youtrack:${YOUTRACK_VERSION} results in empty or invalid base image name (line 6)
Creating youtrack ... done
Creating traefik  ... done

Получается интерполяция внутри docker-compose.dev.yml работает, а вот внутри Dockerfile - нет. Что я упустил?

★★★

Последнее исправление: serg002 (всего исправлений: 1)
Ответ на: комментарий от serg002

ищите ошибки/опечатки, проверьте что у вас работает такой пример:

$ cat .env 
IMG=alpine:3.8
$ cat Dockerfile 
ARG BASE_IMAGE
FROM ${BASE_IMAGE}
ENTRYPOINT ['cat', '/etc/apline-release']

$ cat docker-compose.yml 
version: '3.8'

services:
  myapp:
    build:
      context: .
      args:
        BASE_IMAGE: ${IMG}
    image: test

$ docker-compose build 
[+] Building 0.4s (5/5) FINISHED                                                                                                                      
 => [internal] load build definition from Dockerfile                                                                                             0.0s
 => => transferring dockerfile: 114B                                                                                                             0.0s
 => [internal] load .dockerignore                                                                                                                0.0s
 => => transferring context: 2B                                                                                                                  0.0s
 => [internal] load metadata for docker.io/library/alpine:3.8                                                                                    0.4s
 => CACHED [1/1] FROM docker.io/library/alpine:3.8@sha256:2bb501e6173d9d006e56de5bce2720eb06396803300fe1687b58a7ff32bf4c14                       0.0s
 => exporting to image                                                                                                                           0.0s
 => => exporting layers                                                                                                                          0.0s
 => => writing image sha256:d34ea926894b03df9f20680ee009d2b1a7f29df4692fe7cf7f49eb86c107057a                                                     0.0s
 => => naming to docker.io/library/test                                                   
gagarin0
()
Ответ на: комментарий от gagarin0

cat docker-compose.yml

version: '3.8'

services:
  myapp:
    build:
      context: .
      args:
        BASE_IMAGE: ${IMG}
    image: test

cat Dockerfile

ARG BASE_IMAGE
FROM ${BASE_IMAGE}
ENTRYPOINT ['cat', '/etc/apline-release']
docker-compose build
Building myapp
[+] Building 0.9s (5/5) FINISHED                                                                                    docker:default
 => [internal] load build definition from Dockerfile                                                                          0.0s
 => => transferring dockerfile: 113B                                                                                          0.0s
 => WARN: InvalidDefaultArgInFrom: Default value for ARG ${BASE_IMAGE} results in empty or invalid base image name (line 2)   0.0s
 => [internal] load metadata for docker.io/library/alpine:3.8                                                                 0.6s
 => [internal] load .dockerignore                                                                                             0.0s
 => => transferring context: 2B                                                                                               0.0s
 => CACHED [1/1] FROM docker.io/library/alpine:3.8@sha256:2bb501e6173d9d006e56de5bce2720eb06396803300fe1687b58a7ff32bf4c14    0.0s
 => exporting to image                                                                                                        0.0s
 => => exporting layers                                                                                                       0.0s
 => => writing image sha256:a2623af1b03607e4c65e7f46c7e129ba1872cb21d7eb9c155df8cefffe62371f                                  0.0s
 => => naming to docker.io/library/test                                                                                       0.0s

 2 warnings found (use docker --debug to expand):
 - InvalidDefaultArgInFrom: Default value for ARG ${BASE_IMAGE} results in empty or invalid base image name (line 2)
 - JSONArgsRecommended: JSON arguments recommended for ENTRYPOINT to prevent unintended behavior related to OS signals (line 3)
serg002 ★★★
() автор топика
Последнее исправление: serg002 (всего исправлений: 1)
Ответ на: комментарий от serg002

https://docs.docker.com/reference/build-checks/invalid-default-arg-in-from/

поменяйте первую строчку в Dockerfile на ARG_BASE_IMAGE=alpine:latest и все получится

diff --git a/Dockerfile b/Dockerfile
index 9a0c93d..38327af 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-ARG BASE_IMAGE
+ARG BASE_IMAGE=alpine:latest
 FROM ${BASE_IMAGE}
 ENTRYPOINT ['cat', '/etc/apline-release']
gagarin0
()
Ответ на: комментарий от gagarin0

Только что проверил на других контейнерах, на которых всё работало - там тоже интерполяция перестала работать

 => WARN: InvalidDefaultArgInFrom: Default value for ARG redis:${REDIS_VERSION} results in empty or   0.0s
serg002 ★★★
() автор топика
Последнее исправление: serg002 (всего исправлений: 1)
Ответ на: комментарий от serg002

Так мне надо чтобы из .env эта переменная бралась, а не определялась в Dockerfile :)

ARG BASE_IMAGE=alpine:latest

следует читать как если аргумнет BASE_IMAGE не задан, использовать по умолчанию apline:latest

gagarin0
()
Ответ на: комментарий от anonymous

@serg002 работает, ищите опечатку или ошибку

$ cat .env
YOUTRACK_VERSION=2025.1.64291
$ cat docker-compose.yaml
version: '3.8'

services:
  myapp:
    build:
      context: .
      args:
        YOUTRACK_VERSION: ${YOUTRACK_VERSION}
    image: test
$ cat Dockerfile
ARG YOUTRACK_VERSION=2024.3.57595
FROM jetbrains/youtrack:${YOUTRACK_VERSION} 
$ docker build
[+] Building 0.4s (5/5) FINISHED                                                                                                                      
 => [internal] load .dockerignore                                                                                                                0.0s
 => => transferring context: 2B                                                                                                                  0.0s
 => [internal] load build definition from Dockerfile                                                                                             0.0s
 => => transferring dockerfile: 117B                                                                                                             0.0s
 => [internal] load metadata for docker.io/jetbrains/youtrack:2025.1.64291
gagarin0
()
Последнее исправление: gagarin0 (всего исправлений: 2)
Ответ на: комментарий от gagarin0

Я понял, в Dockerfile в новой версии нужно указать версию по умолчанию. Да что ж это такое? У меня таких контейнеров штук 200-300, это их все чинить надо :(

serg002 ★★★
() автор топика
Ответ на: комментарий от serg002

у вас три стула:

  1. попробовать билдить buildah/kaniko/podman/etc

  2. мигрировать на новый формат, я подозреваю кстати что это пару онлайнеров на sed/awk

  3. использовать формат старой версии и старый docker

gagarin0
()