在 Docker 容器启动期间设置环境变量(在 AWS 上)

Setting environment variable during Docker container start (on 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 进行导出,我会得到回声响应。

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

在 AWS-ECS 的情况下 set Environment variables in Docker is Dockerfile or Task definition 的标准方法。

当前的 docker-入口点将只为该会话设置 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

您将能够看到该值,但在其他会话中将不可用。

另一个例子,

Docker文件

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,因为实例总是在容器之前启动,例如

第二个选项是 or 如果这似乎适用,那么你的入口点将是

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

这就是我修复它的方法,我相信元数据 URL 也有错误,这可能是罪魁祸首。

Docker 文件:

#############
### 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

RUN apk add jq

# 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
ENTRYPOINT ["/bin/sh", "./entrypoint.sh"]

entrypoint.sh

#!/bin/sh
export FARGATE_IP=$(wget -q -O - http://169.254.170.2/v2/metadata | jq -r .Containers[0].Networks[0].IPv4Addresses[0])
echo $FARGATE_IP
java -jar user-service-0.0.1-SNAPSHOT.jar

申请-aws.properties(非完整文件):

eureka.instance.ip-address=${FARGATE_IP}

Eureka 正在 Eureka 状态页面上打印模板错误,但微服务确实连接并响应执行器健康状况和 swagger-ui 来自 Spring Boot.