首页 > 解决方案 > 如何在 docker 容器中定义环境变量以与我的 jar 文件一起使用

问题描述

我有一个通过 jar 文件运行 java 进程的容器。(基于springboot应用程序)

我的 jar 使用容器中的 en vars,因此我的 application.yml 看起来像这样:

应用程序.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

建议?

标签: linuxbashshelldockerenvironment-variables

解决方案


你有没有想过用一个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 的外观,以便您可以按照需要的方式对其进行修改。


推荐阅读