【问题标题】:docker ENV override is not wrokingdocker ENV覆盖不起作用
【发布时间】:2020-06-14 08:48:05
【问题描述】:

我想替换 docker 图像中的文本 所以我使用 ENV 替换文本

但是当我将文本放入 ENV 时,ENV 不会被覆盖

我的码头文件

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;
        }
}

我的运行执行器

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

当我运行 docker image 时,ssl 文件中的SERVER_NAME 应替换为 'docker.havehad.kr' 但它没有
它仍然是“myserver.com”
不知道是什么问题
请帮帮我

【问题讨论】:

    标签: docker nginx environment-variables


    【解决方案1】:

    在处理 docker 映像时,您有 2 个不同的上下文:build 上下文(docker build 命令)和 run 上下文(docker run 命令)。

    来自dockerfile reference

    ENV 指令将环境变量设置为 value 。该值将在构建阶段的所有后续指令的环境中,也可以在许多中内联替换。

    ARG 指令定义了一个用户可以传递的变量 使用 docker build 命令为构建器构建时间 --build-arg = 标志。如果用户指定了未在 Dockerfile 中定义的构建参数,则构建输出 警告。

    您似乎需要一种方法来更改 Dockerfile 中使用的变量来更改您的 sed 命令。您应该使用参数来实现这一点,并且可以将它们与环境变量结合起来,使它们在运行时可用(docker run 命令)

    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),请将它们放入 shell 脚本并将其用作 ENTRYPOINT

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-07
      • 2011-03-24
      • 2014-04-03
      • 1970-01-01
      • 2021-01-24
      • 2018-11-26
      • 2015-03-16
      • 2016-03-18
      相关资源
      最近更新 更多