Dockerfile:有什么方法可以从.env文件读取变量

时间:2020-05-09 08:24:18

标签: docker docker-compose environment-variables dockerfile

我想读取package main import ( "fmt" "io/ioutil" "log" "os" "os/exec" "strings" ) func main() { address := "localhost:9090" file, err := os.OpenFile("/etc/environment", os.O_RDWR, 0644) defer file.Close() if err != nil { panic(err) } input, err := ioutil.ReadAll(file) if err != nil { log.Fatalln(err) } lines := strings.Split(string(input), "\n") for i, line := range lines { if strings.Contains(line, "HTTP_PROXY") { lines[i] = "HTTP_PROXY=" + address } else { if i == (len(lines) - 1) { lines[i] = "HTTP_PROXY=" + address } } } output := strings.Join(lines, "\n") err = ioutil.WriteFile("/etc/environment", []byte(output), 0644) if err != nil { log.Fatalln(err) } cmd := exec.Command("bash", "-c", "source /etc/environment") cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err = cmd.Run() fmt.Println("cmd=================>", cmd, err) if err != nil { fmt.Println(err) } } 文件中定义的Dockerfile中的env | grep -i proxy变量。 有什么办法吗?

这是我的Dockerfile:

PORT

2 个答案:

答案 0 :(得分:6)

已更新

在聊天中进行讨论后,人们意识到nodejs应用程序容器没有问题,而该问题来自错误配置的nginx代理。

nodejs应用程序的工作证明是下一个docker-compose文件。

version: "3"
services:
    api:
        build: .
    curl:
        image: curlimages/curl:7.70.0
        depends_on:
          - api
        entrypoint: ""
        command: curl -si --retry 5 --retry-delay 5 --retry-max-time 40 http://api:6000
        restart: on-failure

原始

如果要在构建过程中更改端口(稍后在运行容器时将是静态的),请使用build-args

docker build --build-arg APP_PORT=3000
FROM node:11-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ARG APP_PORT=80
EXPOSE ${APP_PORT}

COPY . .
RUN APP_PORT=${APP_PORT} npm install

CMD APP_PORT=${APP_PORT} npm run start

如果您希望能够在启动容器时更改端口-则build-args不适合,您需要使用env变量。请注意,构建EXPOSE之后无法更改。

无论如何,如果EXPOSE中有不同的端口并且您的应用程序侦听-它不会破坏任何内容,尽管{{1中未指定}}。

您甚至可以跳过文件中的EXPOSE,因为它更多地是图像的元数据信息,而不是系统打开端口的指令:https://docs.docker.com/engine/reference/builder/#expose

不管EXPOSE设置如何,您都可以在运行时使用-p标志来覆盖它们。

如果构建后图像是静态的(您不打算更改.env),则可以下一步操作,则EXPOSEnpm install具有相同的env。而且您仍然可以在以后更改端口,但这不会影响npm安装。

npm run start

如果您必须将FROM node:11-alpine RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY . . RUN export $(cat .env) && npm install CMD export $(cat .env) && npm run start 保留为数组-那么我们需要创建一个引导脚本

CMD

答案 1 :(得分:2)

您可以在Dockerfile中使用ARG来实现此目的。