如何在 docker 容器中定义环境变量以与我的 jar 文件一起使用 [重复]
Posted
技术标签:
【中文标题】如何在 docker 容器中定义环境变量以与我的 jar 文件一起使用 [重复]【英文标题】:How to define env vars in docker container to be used with my jar file [duplicate] 【发布时间】:2019-12-13 00:22:02 【问题描述】:我有一个通过 jar 文件运行 java 进程的容器。 (基于springboot应用)
我的 jar 使用容器中的 en vars,因此我的 application.yml 看起来像这样:
application.yml:
spring:
profiles:
active: server
datasource:
url: $DATASOURCE_URL
databaseName:
serverName:
username: $DATASOURCE_USERNAME
password: $DATASOURCE_PASSWORD
dataSourceClassName: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
registerMbeans: true
maxPoolSize: $DATASOURCE_MAXPOOLSIZE
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
data:
couchbase:
nodes:
- $COUCHBASE_NODE_1
- $COUCHBASE_NODE_2
bucket: $COUCHBASE_BUCKET
password: $COUCHBASE_PASSWORD
port: $COUCHBASE_PORT
其中,DATASOURCE_USERNAME
,DATASOURCE_PASSWORD
... 是容器本身的环境变量
我的问题是在哪里定义/声明 thos 变量,我尝试将其包含在 .bachrc
中,在文件中,如下所示:
.bachrc:
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
########## CONFIGS FILES ############
source $HOME/envfile.list
和 envfile.list 看起来像这样:
envfile.list:
DATASOURCE_USERNAME="aaa"
DATASOURCE_PASSWORD="bbb"
...
我的 pb 是我的 java 进程看不到这些变量, 注意:我想明确设置这些变量,没有 docker run -e
建议?
【问题讨论】:
你的入口点是什么?如果用户指定docker run --entrypoint='sh --noprofile --norc'
,则您无能为力,将/不应获取任何文件。我的猜测是将source
命令添加到/etc/profile
或其他。你使用的是什么 docker 镜像?你有什么吩咐?你的切入点是什么? .bashrc
文件只有在 shell 是交互式的时候才会被获取。
该问题列出了几乎所有的替代方案,直到在容器启动时运行的入口点脚本中设置它们。 (Shell 点文件是在 Docker 中大部分不起作用的东西之一。)
您的尝试中有几个拼写错误。 Bash 启动文件的名称拼写为 `.bashrc`,在变量赋值中等号周围不能有空格;见***.com/questions/26971987/…
【参考方案1】:
你有没有想过使用docker-compose.yml
文件来制作一堆容器?它也可以只包含一个容器,但您可以使用 environment:
树在其中添加环境变量。
然后,您需要安装docker-compse
,而不是运行docker run
,然后才能启动您的堆栈(即docker-compose.yml
文件中的所有容器。
但是,您的入口点的工作方式仍然很重要。如果它是二进制文件,它将在变量所在的环境中运行。如果它是另一个 shell 脚本,则该入口脚本将需要导出该变量以使其可用于下一个子进程。
您还可以做的是更改 dockerfile 的 ENTRYPOINT 并在其前面添加您的 VAR=KEY
变量定义。它们将可用于子流程:
ENTRYPOINT variable1=value1 variable2=value2 myprocess.sh
如果您无法控制容器,则可以从原始图像构建自己的图像,只需更改入口点:
FROM other/image:latest
ENTRYPOINT variable1=value1 variable2=value2 myprocess.sh
很明显,您要从原始图像中查找的是其 ENTRYPOINT 的外观,以便您可以根据需要对其进行修改。
【讨论】:
以上是关于如何在 docker 容器中定义环境变量以与我的 jar 文件一起使用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
AWS Elastic Beanstalk Docker 环境变量