首页 > 解决方案 > 在 Docker 容器启动期间设置环境变量(在 AWS 上)

问题描述

我正在尝试传递一个变量,该变量使用以下代码获取 IP 地址:

${wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4}

我尝试设置一个入口点 shell 脚本,例如:

#!/bin/sh

export ECS_INSTANCE_IP_ADDRESS=$(wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4)
java -jar user-service-0.0.1-SNAPSHOT.jar

我的 dockerfile 看起来像:

#############
### build ###
#############

# base image
FROM maven:3.6.2-ibmjava-8-alpine as build

# set working directory
WORKDIR /app


# install and cache app dependencies
COPY . /app
RUN mvn clean package


############
### prod ###
############

# base image
FROM openjdk:8-alpine

# set working directory
WORKDIR /app

# copy entrypoint from the 'build environment'
COPY --from=build /app/entrypoint.sh /app/entrypoint.sh

# copy artifact build from the 'build environment'
COPY --from=build /app/target/user-service-0.0.1-SNAPSHOT.jar /app/user-service-0.0.1-SNAPSHOT.jar

# expose port 8081
EXPOSE 8081

# run entrypoint and set variables
ENTRYPOINT ["/bin/sh", "./entrypoint.sh"]

我需要在回显 ECS_INSTANCE_IP_ADDRESS 时显示此变量,以便它可以由 $ECS_INSTANCE_IP_ADDRESS 的 .properties 文件加载。每当我进入容器的 /bin/sh 并回显变量时,它就会显示为空白。如果我在那个 shell 上进行导出,我会得到回显响应。

有任何想法吗?我已经尝试了很多东西,但无法让变量在容器上可用。

标签: dockerenvironment-variablesdocker-entrypoint

解决方案


在 Docker 中设置环境变量的标准方法是 Dockerfile 或AWS-ECS 的任务定义

当前的 docker-entrypoint 只会为该会话设置 env,这就是为什么在执行 ssh 时您得到空值的原因,但您可以验证它是否已在该会话中,但在 Docker 中不推荐这种方法。

你可以验证

#!/bin/sh

export ECS_INSTANCE_IP_ADDRESS=$(wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4)
echo "instance IP is ${ECS_INSTANCE_IP_ADDRESS}" 
java -jar user-service-0.0.1-SNAPSHOT.jar

您将能够看到此值,但在另一个会话中将不可用。

另一个例子,

Dockerfile

FROM node:alpine
WORKDIR /app
COPY run.sh run.sh
RUN chmod +X run.sh
ENTRYPOINT ["./run.sh"]

入口点

#!/bin/sh

export ECS_INSTANCE_IP_ADDRESS=$(wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4)
node -e "console.log(process.env.ECS_INSTANCE_IP_ADDRESS)"

您将看到节点进程能够处理环境,但如果您在容器内运行命令,它将显示undefined.

docker exec -it <container_id> ash -c 'node -e "console.log(process.env.ECS_INSTANCE_IP_ADDRESS)"'

处理 ENV 的两个选项,

如果您已经知道 IP,则传递 IP ENV,因为实例总是在容器之前启动,例如

在此处输入图像描述

第二个选项是将环境变量传递给命令行中的 java 类如何将系统属性传递给 jar 文件 ,如果这似乎适用,那么您的入口点将是

java -DECS_INSTANCE_IP_ADDRESS=$(wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4) -jar myjar.jar 

推荐阅读