如何在 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_USERNAMEDATASOURCE_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 文件一起使用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Docker 镜像和容器的 DevOps 和环境变量

docker容器中的环境变量 - 它是如何工作的?

AWS Elastic Beanstalk Docker 环境变量

Docker容器环境变量设置与查看

在加载/保存期间从 Simulator 目录中提取 plist 以与我的项目一起使用

如何更改 docker 容器中的时区?