我想在我的 Dockerfile 中设置一个多行环境变量。
如果我通过
docker run
传入环境变量,一切正常。
CONFIG="port: 4466
databases:
prod:
connector: mysql
active: true
host: 33.333.333.333
port: 3306
user: root
password: pass"
docker run --env CONFIG="$CONFIG" ubuntu:latest env | grep 'CONFIG'
输出(它只有一行,因为它解释为多行变量)
CONFIG=port: 4466
Dockerfile
FROM ubuntu:latest
ENV CONFIG 'port: 4466\ndatabases:\n prod:\n connector: mysql\n active: true\n host: host\n port: 3306\n user: root\n password: pass'
构建并运行 docker 镜像
docker build -t multilinetest .
docker run multilinetest env | grep 'CONFIG'
输出
CONFIG=port: 4466\ndatabases:\n prod:\n connector: mysql\n active: true\n host: host\n port: 3306\n user: root\n password: pass
两种场景都应该存储相同的环境变量(我将此环境变量传递到需要多行字符串的第三方图像中)
我能够通过将多行环境变量作为构建参数传递给 docker build 来实现此工作。
Dockerfile
FROM ubuntu:latest
ARG CONFIG
ENV CONFIG $CONFIG
构建命令
CONFIG="port: 4466
databases:
prod:
connector: mysql
active: true
host: 33.333.333.333
port: 3306
user: root
password: pass"
docker build --build-arg CONFIG="$CONFIG" ubuntu:latest env | grep 'CONFIG'
转义换行符效果很好。
ENV BUILD_DEPENDENCIES apt-utils \
curl \
libc-dev \
gcc \
gnupg2
Step 8/48 : ENV BUILD_DEPENDENCIES apt-utils curl libc-dev gcc gnupg2
---> Running in 65b0ad105af4
您可以导出环境变量并仅将其名称传递给docker。也可以在 docker-compose 中使用。
root@e14:~# export KCONFIG=$(head /boot/config-$(uname -r))
root@e14:~# echo "$KCONFIG"
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86 6.5.0-28-generic Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0"
CONFIG_CC_IS_GCC=y
CONFIG_GCC_VERSION=120300
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=23800
root@e14:~# docker run --env KCONFIG --rm --entrypoint /bin/bash ubuntu:22.04 -c 'echo "$KCONFIG"'
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86 6.5.0-28-generic Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0"
CONFIG_CC_IS_GCC=y
CONFIG_GCC_VERSION=120300
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=23800