Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多阶段构建中的Docker环境变量_Docker_Environment Variables_Docker Compose_Dockerfile - Fatal编程技术网

多阶段构建中的Docker环境变量

多阶段构建中的Docker环境变量,docker,environment-variables,docker-compose,dockerfile,Docker,Environment Variables,Docker Compose,Dockerfile,给定此.env文件: TEST=33333 service_name: image: test env_file: .env environment: TEST: 22222 FROM an_image AS builder FROM another_image ENV TEST 11111 CMD ["/bin/echo $TEST"] 给定此docker compose.yml文件: TEST=33333 service_name:

给定此
.env
文件:

TEST=33333
  service_name:
    image: test
    env_file: .env
    environment:
      TEST: 22222
FROM an_image AS builder

FROM another_image
ENV TEST 11111

CMD ["/bin/echo $TEST"]
给定此
docker compose.yml
文件:

TEST=33333
  service_name:
    image: test
    env_file: .env
    environment:
      TEST: 22222
FROM an_image AS builder

FROM another_image
ENV TEST 11111

CMD ["/bin/echo $TEST"]
给定此
Dockerfile
文件:

TEST=33333
  service_name:
    image: test
    env_file: .env
    environment:
      TEST: 22222
FROM an_image AS builder

FROM another_image
ENV TEST 11111

CMD ["/bin/echo $TEST"]
每当我在容器中构建并运行此映像时,它都会打印
11111

如果从Dockerfile中删除
ENV 11111
行,则我的
TEST
环境变量为空

父映像是否接收环境变量而不是子映像

谢谢

编辑:

  • 尝试
    ENV TEST${TEST}
    无效($TEST为空)
  • 删除
    ENV TEST
    无效($TEST为空)

  • 所以这不是一个多阶段的问题

    它显示
    ENV
    变量仅在运行容器时使用(
    docker compose up
    )。不在生成时(
    docker compose build
    )。因此,您必须使用
    参数

    .env

    TEST=11111
    
    version: '3'
    services:
      test:
        build:
          context: .
          args:
            TEST: ${TEST}
    
    FROM nginx:alpine
    ARG TEST
    ENV TEST ${TEST}
    CMD ["sh", "-c", "echo $TEST"]
    
    docker rmi test_test:latest ; docker-compose build && docker run -it --rm test_test:latest
    
    docker compose.yaml

    TEST=11111
    
    version: '3'
    services:
      test:
        build:
          context: .
          args:
            TEST: ${TEST}
    
    FROM nginx:alpine
    ARG TEST
    ENV TEST ${TEST}
    CMD ["sh", "-c", "echo $TEST"]
    
    docker rmi test_test:latest ; docker-compose build && docker run -it --rm test_test:latest
    
    Dockerfile

    TEST=11111
    
    version: '3'
    services:
      test:
        build:
          context: .
          args:
            TEST: ${TEST}
    
    FROM nginx:alpine
    ARG TEST
    ENV TEST ${TEST}
    CMD ["sh", "-c", "echo $TEST"]
    
    docker rmi test_test:latest ; docker-compose build && docker run -it --rm test_test:latest
    
    测试命令

    TEST=11111
    
    version: '3'
    services:
      test:
        build:
          context: .
          args:
            TEST: ${TEST}
    
    FROM nginx:alpine
    ARG TEST
    ENV TEST ${TEST}
    CMD ["sh", "-c", "echo $TEST"]
    
    docker rmi test_test:latest ; docker-compose build && docker run -it --rm test_test:latest
    
    严重的是,文件有点缺乏


    参考资料:

    问题并不是多阶段的

    这是关于Dockerfile
    ARG
    和docker compose YAML
    build
    args
    (“构建参数”)之间的差异;和Dockerfile
    ENV
    &docker编写YAML
    环境
    /
    .ENV

    args
    添加生成参数,这些参数是仅在生成过程中可访问的环境变量

    来自 从简单开始,只显示
    Dockerfile
    和YAML之间的交互:

    ARG buildno
    ARG gitcommithash
    
    RUN echo "Build number: $buildno"
    RUN echo "Based on commit: $gitcommithash"
    
    将其与问题联系起来的示例: 看


    文档&加深您的理解 一次学习一层抽象 我建议从Dockerfile的抽象级别向上。确保在添加下一层抽象之前理解每一层

  • Dockerfile(然后使用Dockerfile中运行的容器…使用默认的
    ENV
    ,然后使用
    --ENV
    ,然后使用
    ARG
    --build ARG

  • 然后在中添加docker compose细节,并使用这些细节

  • 然后返回DockerFile并了解多阶段构建

  • Dockerfile 一篇有用的博客文章——关注Dockerfile,但在所有情况下,最好在添加额外的抽象层(如docker compose YAML)之前,先单独理解Dockerfile

    docker compose 然后docker撰写官方文件:

    多级Dockerfiles

    我无法重现您的问题,您是否真的在
    CMD
    中评估变量?
    CMD
    是运行时,而不是构建时。是否可以将my.env文件传递给args?