docker ENV не работает - PullRequest
       4

docker ENV не работает

0 голосов
/ 02 марта 2020

Я хочу заменить текст в docker изображении, поэтому я использую ENV для замены текста

, но когда я помещаю текст в ENV, ENV не переопределяется

мой dockerfile

RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Define mountable directories.
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

ENV PROXY_PASS http://localhost:3000
ENV SERVER_NAME myserver.com
ENV PEM_PATH /etc/nginx/certs/cert.pem
ENV KEY_PATH /etc/nginx/certs/cert.key

WORKDIR /etc/nginx

RUN rm -f sites-enabled/default
ADD ./sites-available/ssl /etc/nginx/sites-available/ssl
RUN sed -ri 's@PROXY_PASS@'${PROXY_PASS}'@' sites-available/ssl
RUN sed -ri 's@SERVER_NAME@'${SERVER_NAME}'@' sites-available/ssl
RUN sed -ri 's@PEM_PATH@'${PEM_PATH}'@' sites-available/ssl
RUN sed -ri 's@KEY_PATH@'${KEY_PATH}'@' sites-available/ssl
RUN cp -f sites-available/ssl sites-available/default
#RUN ln -s /etc/nginx/sites-available/ssl sites-enabled/default

EXPOSE 80 443

CMD ["nginx"]

целевой файл: ssl

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;

        ssl    on;
        ssl_certificate  PEM_PATH;
        ssl_certificate_key   KEY_PATH;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name SERVER_NAME;

        location / {
                        # First attempt to serve request as file, then
                        # as directory, then fall back to displaying a 404.
                        proxy_pass PROXY_PASS;
                        proxy_http_version 1.1;
                        proxy_set_header Upgrade $http_upgrade;
                        proxy_set_header Connection 'upgrade';
                        proxy_set_header Host $host;
                        proxy_cache_bypass $http_upgrade;
        }
}

мой запуск exe c

docker run -d -e "SERVER_NAME=docker.havehad.kr" --name nginx-ssl -p 443:443 --rm nginx-ssl

при запуске docker image SERVER_NAME в файле ssl следует заменить на 'docker .havehad.kr', но это не
он все еще остается 'myserver.com'
Я не знаю, в чем проблема
Пожалуйста, помогите мне

1 Ответ

0 голосов
/ 02 марта 2020

Вы имеете 2 различных контекста при работе с docker образом: build context (docker build build) и run context (docker run command).

Из ссылка на файл Docker :

Инструкция ENV устанавливает значение переменной среды в значение. Это значение будет присутствовать в среде для всех последующих инструкций на этапе сборки и может быть также заменено во многих встроенных.

Инструкция ARG определяет переменную, которую пользователи могут передавать во время сборки разработчику с docker команда построения с использованием флага --build-arg =. Если пользователь указывает аргумент сборки, который не был определен в Dockerfile, сборка выдает предупреждение.

Похоже, вам нужен способ изменения переменных, используемых в Dockerfile, для изменения ваших команд sed. Для этого вы должны использовать аргументы, и вы можете комбинировать их с переменными среды, чтобы сделать их доступными во время выполнения (docker команда запуска)

RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# Define mountable directories.
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

ARG PROXY_PASS=http://localhost:3000
ARG SERVER_NAME=myserver.com
ARG PEM_PATH=/etc/nginx/certs/cert.pem
ARG KEY_PATH=/etc/nginx/certs/cert.key

ENV PROXY_PASS ${PROXY_PASS}
ENV SERVER_NAME ${SERVER_NAME}
ENV PEM_PATH ${PEM_PATH}
ENV KEY_PATH ${KEY_PATH}


WORKDIR /etc/nginx

RUN rm -f sites-enabled/default
ADD ./sites-available/ssl /etc/nginx/sites-available/ssl
RUN sed -ri 's@PROXY_PASS@${PROXY_PASS}@' sites-available/ssl
RUN sed -ri 's@SERVER_NAME@${SERVER_NAME}@' sites-available/ssl
RUN sed -ri 's@PEM_PATH@${PEM_PATH}@' sites-available/ssl
RUN sed -ri 's@KEY_PATH@${KEY_PATH}@' sites-available/ssl
RUN cp -f sites-available/ssl sites-available/default
#RUN ln -s /etc/nginx/sites-available/ssl sites-enabled/default

EXPOSE 80 443

CMD ["nginx"]

И вы можете изменить значения аргументов при построении изображения :

$ docker build --build-arg SERVER_NAME=docker.havehad.kr .

Ваш аргумент ${SERVER_NAME} будет заменен в инструкциях Dockerfile (ENV и RUN) на docker.havehad.kr.

Если вам нужно изменить команды sed во время выполнения (docker run), поместите их в скрипт оболочки и используйте его как ENTRYPOINT

...