将 bash 变量传递给另一个应用程序

将 bash 变量传递给另一个应用程序

我试图从文件中读取一些值,将它们保存在bash变量中,然后docker通过将这些值作为环境变量传递来运行。该文件的结构如下:

DB_NAME=db
ROOT_PASS=root123
USER_NAME=dev
USER_PASS=dev123

代码就像这样:

ROOT_PASS=$(sed -nr '/ROOT_PASS=(\d*)/p' .env | cut -d '=' -f 2)
USER_NAME=$(sed -nr '/USER_NAME=(\d*)/p' .env | cut -d '=' -f 2)
USER_PASS=$(sed -nr '/USER_PASS=(\d*)/p' .env | cut -d '=' -f 2)
DB_NAME=$(sed -nr '/DB_NAME=(\d*)/p' .env | cut -d '=' -f 2)


echo -e $USER_NAME
echo -e $USER_PASS
echo -e $DB_NAME
docker volume ls


docker run --rm \
  --name init-mysql \
  -v mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=$ROOT_PASS \
  -e MYSQL_USER=$USER_NAME \
  -e MYSQL_PASSWORD=$USER_PASS \
  -e MYSQL_DATABASE=$DB_NAME \
  -d mysql:latest 
  && docker exec init-mysql echo $MYSQL_ROOT_PASSWORD

运行此脚本的结果是,我期望$MYSQL_ROOT_PASSWORD在屏幕上看到打印的值,但它只回显空行(因此,我的root用户有一个空密码)。我究竟做错了什么?我应该如何将 bash 变量的值传递给docker环境变量?

PS:我知道docker-compose.yml,但是,在这里,我必须使用这种方法。

答案1

看起来它对我有用:

ROOT_PASS=$(sed -nr '/ROOT_PASS=(\d*)/p' .env | cut -d '=' -f 2)
echo $ROOT_PASS 
root123

set -x显示docker命令执行的xtrace( )。

由于文件结构允许立即source执行,为什么不呢?您还需要allexport预先设置该选项,以便在分配变量时自动将变量导出到环境中,以便 docker 继承它们:

$ set -o allexport
$ . ./.env
$ echo "$ROOT_PASS"
root123
$ echo "$USER_NAME"
dev
$ printenv USER_NAME
dev
$ echo "$USER_PASS"
dev123

相关内容