【问题标题】:How to pass ENV arguments in my Dockerfile when using docker-compose使用 docker-compose 时如何在我的 Dockerfile 中传递 ENV 参数
【发布时间】:2021-03-02 16:19:50
【问题描述】:

我有一个 docker-compose.yml 有一个部分:

myservice:
  env_file:
    - myvars.env

我的环境变量文件有:

myvars.env:
SOME_VAL=123

然后在我的 Dockerfile 中有这个:

..
RUN echo "some_val ${SOME_VAL}"
ENTRYPOINT bash ${APP_BASE}/run.sh SOME_VAL=${SOME_VAL}

当我运行 docker-compose up 时,some_val 的值为空。

  1. 为什么在我的 dockerfile 中无法访问 SOME_VAL?
  2. 如何将环境变量 SOME_VAL 传递给我的 run.sh 脚本?

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    你需要declare the variable with ENV in the Dockerfile before using it:

    在构建过程中也可以使用 ENV 变量,只要您使用 ENV 指令引入它们。

    Dockerfile
    ENV SOME_VAL
    RUN echo "some_val ${SOME_VAL}"
    ENTRYPOINT bash ${APP_BASE}/run.sh SOME_VAL=${SOME_VAL}
    

    【讨论】:

    • 如果我只输入ENV SOME_VAL,我会收到一条错误消息“ENV 必须有两个参数”
    • @Blankman 你可以做ENV SOME_VAL=。我记得不需要=,但更新中肯定有一些变化。
    【解决方案2】:

    当您docker-compose build 图像时,它只考虑docker-compose.yml 文件的build: 部分。不考虑文件任何其他部分的任何其他内容。 environment:env_file: 设置不可用,volumes:networks: 也不可用。传入设置的唯一方法是通过 Dockerfile ARG 和相应的 Compose args: 设置,即便如此,您也只想将其用于“编译”到映像中的内容。

    方便的是,shell脚本已经可以直接访问环境变量,所以你根本不需要做任何事情;只需使用变量。

    #!/bin/sh
    # run.sh
    
    echo "SOME_VAL is $SOME_VAL"
    
    # Dockerfile
    FROM busybox
    WORKDIR /app
    COPY run.sh .
    # RUN chmod +x run.sh
    CMD ["./run.sh"]
    
    # docker-compose.yml
    version: '3.8'
    services:
      echoer:
        build: .
        env_file:
          - my_vars.env
        # environment:
        #   SOME_VAL: foo
    

    【讨论】:

    • 但是 SOME_VAL 是在外部文件 myvars.env 中定义的
    • 设置 env_file: [myvars.env] 将在加载它的同时以与将其内联到 environment: 的方式相同。容器内部的进程无法区分。
    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多