帮忙了解 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