docker - 在 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 上进行导出,我会得到回显响应。
有任何想法吗?我已经尝试了很多东西,但无法让变量在容器上可用。
解决方案
在 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
推荐阅读
- swift - Swift segue 否定连接到 segue 对象的其他功能
- ruby-on-rails - 如何使用 active_record gem 使用相同的适配器(postgres)建立与多个数据库的连接?
- php - 无法搜索数组值
- java - 在 30 秒循环中每 5 秒打印一次当前日期
- laravel - Laravel Blade 视图未显示从控制器传递的数据
- maven - 如何使用 pom.xml 在 JAVA 项目的 ci/cd 管道中配置 selenium 记录播放测试?
- javascript - JavaScript 永久链接 URL
- java - android 9上相机“1”的Sinch VideoCaptureThread问题
- python-3.x - 我收到错误消息:ValueError: no enough values to unpack (expected 2, got 1)。可能是什么问题呢?
- sms - 如何在使用可变字母数字发件人 ID 时发送给多个收件人(没有循环)?