繁体   English   中英

使用 gradle 任务构建映像时,无法在 docker 容器内设置环境变量

[英]Not able to set environment variables inside a docker container when building image using gradle task

我在我的 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]

我还尝试通过使用 run 命令中的 -e 参数并将我的 ~/.aws/credentials 文件安装到 docker 容器中,直接在 run 语句中设置环境变量,但是对于这些,我也得到了相同的异常。

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

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>

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

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

请参阅这篇文章了解更多信息。

终于可以将我的凭据文件安装到 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 the amazon java sdk will try to load the credentials from the env variables first and then from the java system properties and then from the default credential profiles file.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM