我有一个通过 jar 文件运行 java 进程的容器。 (基于springboot应用)
我的 jar 使用容器中的 en var,因此我的 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
...是容器本身的环境变量
我的问题是在哪里定义/声明变量,我尝试将其包含在 .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-compose.yml
文件来制作一堆容器?它也可以只包含一个容器,但您可以使用 environment:
树在其中添加环境变量。
然后,您不需要运行 docker run
,而是需要安装 docker-compse
,然后启动您的堆栈(意味着 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 的样子,以便您可以按照您需要的方式对其进行修改。
关于linux - 如何在 docker 容器中定义环境变量以与我的 jar 文件一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57359238/