Docker的ARG、ENV和.env配置完整指南

帮忙了解 ENV、ARG 、 env_file 、 .env; 了解如何使用docker 构建时变量、 环境变量和docker-compose 模版

Docker

ENV 指令

无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。

ARG 指令

构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的

docker-compose

分两种变量: 1. 替换docker-compose.yml 的变量, 2. 注入到容器里的环境变量

db:
  image: "postgres:${POSTGRES_VERSION}"
// 当docker-compose up 执行时,会在当前shell 环境查询POSTGRES_VERSION 变量,并替换

docker-compose 文件支持 $VARIABLE and ${VARIABLE} 两种方式

.env 文件

1. env 文件仅在使用docker-compose.yml 文件时的预处理步骤中使用。$变量被替换为同一目录中名为“.env”的文件中包含的值

$  cat .env
TAG=v1.5

$ cat docker-compose.yml
version: '3'
services: 
  web: 
      image: "webapp:${TAG}"

$ docker compose convert
version: '3'
services: 
  web: 
      image: "webapp:v1.5"

shell 里环境变量 优先 于.env 文件变量

$ export TAG=v2.0
$ docker compose convert
version: '3'
services: 
  web: 
      image: "webapp:v2.0"

docker-compose 设置 容器里的环境变量

在docker-compose.yml 设置 environment key, 效果和 docker run -e VARIABLE=VALUE ...

web:
  environment:
    - DEBUG=1

传递shell环境变量到容器

可以直接使用当前shell 环境变量到容器里,就是在设置 environment key 时不加value,如果没有在当前的 shell 中导出环境变量 DEBUG,compose file 中会把它解释为 null; 效果和下列一样

$ docker run -e DEBUG -e DEBUG2 ubuntu env | grep VAR     #env是命令 查询环境变量
DEBUG=value1
DEBUG2=value2
web:
  environment:
    - DEBUG
    - DEBUG2

–env_file 为容器设置多个环境变量

通过使用env_file 参数,可以指定env 文件路径, 这时构建时可以指定不同的文件

 $ docker-compose --env-file ./config/.env.dev up 

设置多个环境变量到容器,通过制定 env file 文件 , 如同 docker run –env-file=FILE ...

web:
  env_file:
    - web-variables.env

前端项目 标准配置

# syntax=docker/dockerfile:1
FROM node:12 AS build
WORKDIR /app
COPY package* yarn.lock ./
RUN yarn install
COPY public ./public
COPY src ./src
RUN yarn run build

FROM nginx:alpine
COPY --from=build /app/build   /usr/share/nginx/html

最佳实践

在 docker-compose.yml 文件所在的目录创建 test.sh 和 prod.sh,test.sh 的内容如下

test.sh:

#!/bin/bash 
# define env var default value. 
export IMAGETAG=web:v1 
export APPNAME=HelloWorld 
export AUTHOR=Nick Li 
export VERSION=1.0

prod.sh

#!/bin/bash 
# define env var default value. 
export IMAGETAG=webpord:v1 
export APPNAME=HelloWorldProd 
export AUTHOR=Nick Li 
export VERSION=1.0LTS

测试环境下 执行 $ source test.sh $ docker-compose config

生产环境下,执行下面的命令:$ source prod.sh $ docker-compose config

Leave a Reply

Your email address will not be published. Required fields are marked *