【问题标题】:Not able to set environment variables inside a docker container when building image using gradle task使用 gradle 任务构建映像时无法在 docker 容器内设置环境变量
【发布时间】:2020-02-13 12:23:26
【问题描述】:

我在 build.gradle 文件中写了一个 gradle 任务 buildDocker 如下:

task buildDocker(type: Docker, dependsOn: copyJar) {
    push = false
    baseImage "openjdk:8u151"
    println System.getenv('AWS_ACCESS_KEY_ID')
    println System.getenv('AWS_SECRET_ACCESS_KEY')
    setEnvironment('AWS_ACCESS_KEY_ID',System.getenv('AWS_ACCESS_KEY_ID'))
    setEnvironment('AWS_SECRET_ACCESS_KEY',System.getenv('AWS_SECRET_ACCESS_KEY'))
    runCommand("mkdir myProject")
    addFile("myProject-0.0.jar","myProject/")
    workingDir("/myProject")
    runCommand("unzip -q myProject-0.0.jar")
    exposePort(8888)
    entryPoint(["java","-XX:+UnlockExperimentalVMOptions","- 
XX:+UseCGroupMemoryLimitForHeap","-XX:MaxRAMFraction=1","-XshowSettings:vm","-cp", 
"/myProject-config:.","org.springframework.boot.loader.JarLauncher"])
}

当我通过运行任务构建图像时,我能够在终端中看到 println 输出。但是当我运行图像时,我不断收到以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'simpleMessageListenerContainer' defined in class path resource [org/springframework/cloud/aws/messaging/config/annotation/SqsConfiguration.class]: Invocation of init method failed; nested exception is com.amazonaws.SdkClientException: Unable to load AWS credentials from any provider in the chain: [com.amazonaws.auth.profile.ProfileCredentialsProvider@46244e65: profile file cannot be null]
Caused by: com.amazonaws.SdkClientException: Unable to load AWS credentials from any provider in the chain: [com.amazonaws.auth.profile.ProfileCredentialsProvider@46244e65: profile file cannot be null]

我还尝试通过在运行命令中使用 -e 参数并将我的 ~/.aws/credentials 文件安装到 docker 容器中直接在运行语句中设置环境变量,但有了这些,我也得到了同样的例外。

EDIT1:这是使用 -e 标志的 docker run 命令:

docker run -e AWS_ACCESS_KEY_ID=XXXX -e AWS_SECRET_ACCESS_KEY=XXXX --link mysql --name myapp <imageName>

另外,将凭据作为键值对放入 file-env.list 并尝试以下操作:

docker run --env-file env.list -v --link mysql --name myapp <imagename>

【问题讨论】:

    标签: java amazon-web-services docker gradle


    【解决方案1】:

    在构建映像时运行的脚本中定义的环境变量在基于该映像创建容器时不会保留。

    您需要在 Dockerfile 中使用 ENV 指令显式设置环境变量,或者在运行容器时使用 -e 标志设置它们。

    请参阅this article 了解更多信息。

    【讨论】:

    • 我也尝试在运行命令中使用 -e 标志设置环境变量,但我仍然得到相同的异常。
    • 您能否更新您的问题以反映您如何尝试使用 -e 标志?
    【解决方案2】:

    终于可以将我的凭据文件挂载到 docker 容器中了:

    docker run -p 8888:8888 -v ~/.aws:/root/.aws --link mysql --name myapp <imageName>
    

    凭据已创建并存储在 .aws 文件夹中。我之前做的错误,挂载是一个愚蠢的错误,可能是因为疲劳,我一直将它挂载到容器中的 /home 目录,但容器中的主文件夹(~)是 /root,所以一旦我改变了它,没有任何问题。虽然我仍然不明白为什么 -e 标志不起作用,因为根据这个 - https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html amazon java sdk 将尝试先从 env 变量加载凭据,然后再从Java 系统属性,然后从默认凭据配置文件文件中。

    【讨论】:

      猜你喜欢
      • 2015-11-07
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多