@canolo3666

Почему Dockerfile видит одну переменную, но не видит вторую?

.env файл:
# nginx
NGINX_VERSION=1.25.1

# paths
APP_CODE_PATH_CONTAINER=/var/www/html


Dockerfile
# Arguments.
ARG NGINX_VERSION
ARG APP_CODE_PATH_CONTAINER

# Install nginx.
FROM nginx:${NGINX_VERSION}-alpine

# Load scripts.
COPY scripts/* /tmp/scripts/
RUN chmod -R 777 /tmp/scripts/

# Modify configuration.
RUN /tmp/scripts/modify_config.sh /etc/nginx/conf.d/default.conf "__NGINX_ROOT" ${APP_CODE_PATH_CONTAINER};

...


Переменная NGINX_VERSION всегда видна, а вот APP_CODE_PATH_CONTAINER почему-то нет и после сборки вываливается ошибка: nginx: [emerg] invalid number of arguments in "root" directive in /etc/nginx/conf.d/default.conf:5, т.к эта самая директива приняла пустую строку вместо пути. Пробовал сбрасывать кэш, не помогло, тут есть какие-то нюансы с порядком объявления аргументов? Почему так?
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
https://docs.docker.com/engine/reference/builder/#...

ARG объявленные до FROM попадают в global scope. И на практике их можно использовать напрямую только в FROM.
Что бы их было видно внутри сборки их нужно заново объявить внутри сборки.

# Arguments.
ARG NGINX_VERSION
ARG APP_CODE_PATH_CONTAINER

# Install nginx.
FROM nginx:${NGINX_VERSION}-alpine

# Load scripts.
COPY scripts/* /tmp/scripts/
RUN chmod -R 777 /tmp/scripts/

# объявляем ещё раз. Как можно ближе к реальному месту использования что бы не испортить кеширование директив выше.
ARG APP_CODE_PATH_CONTAINER

# Modify configuration.
RUN /tmp/scripts/modify_config.sh /etc/nginx/conf.d/default.conf "__NGINX_ROOT" ${APP_CODE_PATH_CONTAINER};

...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы