Невозможно заменить переменную окружения nginx в Dockerfile - PullRequest
0 голосов
/ 08 мая 2019

Я передаю конечную точку REST API как переменную env во время сборки докера nginx, и, потратив 6 часов на то, чтобы попробовать большинство предложений, у меня не хватило сил / терпения попробовать.

nginx conf, что яподставляю:

location /my-api/ {
    proxy_pass  ${api_url}/;
}

Я передаю это значение во время сборки докера:

#base_url comes from system env 
docker build --build-arg base_api_url=$base_url

Я получаю это значение в моем Dockerfile:

ARG base_api_url
ENV  api_url=$base_api_url

# This prints the value
RUN echo "api_url= ${api_url}" . 

COPY package.json /usr/src/app/package.json
RUN npm install
COPY . /usr/src/app
RUN npm run build

FROM nginx:1.15.8-alpine
COPY --from=builder /usr/src/app/build /usr/share/nginx/html
EXPOSE 80

# this works
COPY nginx.conf /etc/nginx/nginx.conf.template

# Initially following code was building and deploying docker image and url was hard coded. it was working
# COPY nginx.conf /etc/nginx/conf.d/default.conf 
# Below will start the image but no REST endpoint configured
# CMD ["nginx", "-g", "daemon off;"]

# To substitute the api url few of the many things I have tried.
# Non of the below, have been able to replace the env api_url with its value 
# Actually I don't know -- since /etc/nginx/conf.d/default.conf is not replaced at all

# CMD /bin/bash -c "envsubst < nginx.conf > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
# CMD /bin/sh -c "envsubst < nginx.conf > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;' || cat /etc/nginx/nginx.conf"

# Last status
CMD envsubst < /etc/nginx/nginx.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'

/ etc/nginx/conf.d/default.conf должен заменить api_url:

location /my-api/ {
    proxy_pass http://theApiURL;
}

Я также попытался специально передать переменную env, например:

CMD envsubst ${api_url} < /etc/nginx/nginx.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'

и варианты, например, с использованием tee.

Любая помощь / направление для решения этой проблемы приветствуется.

1 Ответ

0 голосов
/ 08 мая 2019

Обычно я делаю это вне Dockerfile, используя sed, в сценарии развертывания.

Вот пример:

 #!/usr/bin/env bash
 # Deploys locally for dev work

 set -e
 export API_URL=www.theapiurl.com

 sed "s/api_url/${API_URL}/" nginx.conf.template > nginx.conf
 ...

 # run docker
 docker-compose build --no-cache
 docker-compose up -d

Конечно, вы можете установить переменную среды, однако имеет смыслдля вашего случая использования.Я считаю этот подход гораздо более гибким, чем все, что предоставляет Docker.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...