如何将文件从Docker镜像写入EFS?

时间:2016-12-28 19:44:22

标签: amazon-web-services docker amazon-ec2 amazon-ecs

组合物

  • EC2实例上的Jenkins服务器使用EFS
  • 以上Jenkins服务器的Docker镜像

需要

  • 每次ECS启动构建Jenkins服务器的任务
  • 时,将模板写入EFS上的目录

在哪里开始写一个步骤的适当位置?

试过

如果我在Dockerfile中执行此操作,它会写入Docker镜像,但从不将更改传播到EFS,以便模板可用作Jenkins服务器上的项目。

我已经尝试将写入命令放在jenkins.sh中,但我无法弄清楚它是如何运行的,无论如何它不会将模板放在我需要的地方。

2 个答案:

答案 0 :(得分:0)

您需要使用卷启动任务,然后将该卷装入容器。这样,您可以在多个Jenkins启动/停止周期中拥有持久存储。

您的任务定义如下所示(我已删除了不相关的部分)。重要的组件是mountPointsvolumes。并不是说volumesFrom相同,因为您不是从另一个容器装载卷,而是在一个任务中运行它们。

这也假设您在默认的JENKINS_HOME目录中运行Jenkins,并将您的EFS驱动器安装到EC2实例上的/mnt/efs/jenkins-home

{
  "requiresAttributes": ...
  "taskDefinitionArn": ... your ARN ...,
  "containerDefinitions": [
    {
      "portMappings": ...
      .... more config here .....   
      "mountPoints": [
        {
          "containerPath": "/var/jenkins_home",
          "sourceVolume": "jenkins-home",
        }
      ]
    }
  ],
  "volumes": [
    {
      "host": {
        "sourcePath": "/mnt/efs/jenkins-home"
      },
      "name": "jenkins-home"
    }
  ],
  "family": "jenkins"
}

ECS中的任务定义:

ECS Task Definition for Jenkins task

答案 1 :(得分:0)

原始问题包括:

  

将模板写入EFS上的目录每次 ECS 启动任务

除了@luke-peterson's answer之外,您还可以使用shell脚本作为docker文件中的入口点,以便在已挂载的EFS文件夹和容器之间复制文件。

在dockerfile中使用以下指令代替ENTRYPOINT:

CMD ["sh", "/app/startup.sh"]

在startup.sh中,您可以自由复制文件并运行该应用程序(在我的示例中为 .net核心应用程序):

cp -R /app/wwwroot/. /var/jenkins-home 
dotnet /app/app.dll

当然,您也可以通过编程方式来植入应用程序本身。