docker-compose - 如何将.env文件中的环境变量传递到Dockerfile中?

4

我有一个docker-compose文件,部分内容如下:

  nginx:
    container_name: ${NGINX_CONTAINER_NAME}
    ports:
      - ${NGINX_HTTP_PORT1}:${NGINX_HTTP_PORT2}
      - ${NGINX_HTTPS_PORT1}:${NGINX_HTTPS_PORT2}
    build: 
      dockerfile: Dockerfile
      args: 
       - NGINX_VERSION=${NGINX_VERSION}
    volumes:
      - ${NGINX_CONF_DIR:-./nginx}:/etc/nginx/conf.d
      - ${NGINX_LOG_DIR:-./logs/nginx}:/var/log/nginx
      - ${WORDPRESS_DATA_DIR:-./wordpress}:/var/www/html
    depends_on:
      - wordpress
    restart: always

您可以看到,我正在尝试将一个名为NGINX_VERSION的变量传递到Dockerfile中。 以下是.env文件的内容:
# nginx
NGINX_VERSION=1.21.3
NGINX_HTTP_PORT1=8085
NGINX_HTTP_PORT2=8085
NGINX_HTTPS_PORT1=443
NGINX_HTTPS_PORT2=443
NGINX_CONTAINER_NAME=dev_nginx

以下是有效的Dockerfile示例:

FROM nginx:1.21.3

RUN apt-get update \
  && apt-get -y install openssl \
  && apt-get -y install vim

RUN mkdir -p /etc/openssl/certs
RUN mkdir -p /etc/nginx/snippets
RUN openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/openssl/nginx-selfsigned.key -out /etc/openssl/nginx-selfsigned.crt -subj "/C=US/ST=NY/L=NY/O=ACME/OU=CD/CN=WPDeveloper"

问题

当我在 Dockerfile 中更改图像名称,使其如下所示:

 FROM nginx:$NGINX_VERSION

或者这样:
 FROM nginx:${NGINX_VERSION}

I get the following error:

failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to parse stage name "nginx:": invalid reference format

当我在Dockerfile中硬编码版本号时,一切都正常。此外,如果有帮助的话,我通过运行以下命令验证env中的值是否被读取:

  docker-compose -f .\docker-compose.yml config

部分输出结果如下 - 请注意它找到了正确的NGINX版本值

nginx:
    build:
      dockerfile: Dockerfile
      args:
        NGINX_VERSION: 1.21.3
    container_name: dev_nginx
    depends_on:
      wordpress:
        condition: service_started
    networks:
      default: null
    ports:
    - mode: ingress
      target: 8085
      published: 8085
    - mode: ingress
      target: 443
      published: 443
      protocol: tcp
    restart: always
    volumes:
      source: ./nginx
      target: /etc/nginx/conf.d
      bind:
        create_host_path: true
    - type: bind
      source: ./logs/nginx
      target: /var/log/nginx
      bind:
        create_host_path: true
    - type: bind
      source: ./wordpress
      target: /var/www/html
      bind:
        create_host_path: true

任何建议都将不胜感激。


1
你是否在 FROM 行之前声明了 ARG?请参考 Use --build-arg value in Dockerfile FROM parameter 的示例。 - David Maze
@DavidMaze 这就是我错过的!如果你想把它作为答案添加,我会接受它。 - dot
2个回答

4
如果您想让docker-compose文件从.env文件中读取变量,然后将其传递给Dockerfile,可以按照以下设置进行操作:
这是您的.env文件包含的内容:
# nginx
NGINX_VERSION=1.21.3

以下是您的Dockerfile:

ARG NGINX_VERSION
FROM nginx:${NGINX_VERSION}
...

最后,这将是您的docker-compose.yml文件:

nginx:
  build:
    context: .
    dockerfile: Dockerfile
    args:
      NGINX_VERSION: ${NGINX_VERSION}

  ...

最后运行:

docker-compose up

确保您的 .env 文件和 Dockerfile 以及 docker-compose.yml 文件位于同一目录中。


2
您在docker-compose文件中指定了args,但我没有看到相应的ARG在您的Dockerfile中?您还需要注意ARG和FROM之间的交互作用
这是一个最小化的示例,我能够重新创建您的错误,并通过在FROM语句之前添加ARG来修复它。
version: "3.8"
services:
  test:
    build:
      context: ./
      dockerfile: Dockerfile
      args:
        - ALPINE_VERSION=3.14

ARG ALPINE_VERSION=3

FROM alpine:${ALPINE_VERSION}

ENTRYPOINT [ "sh" ]

缺少ARG参数的错误

解决失败:RPC错误:代码=未知,描述=使用dockerfile.v0前端解决失败:无法创建LLB定义:无法解析阶段名称“alpine:”:无效的引用格式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接