Exemplos de montagem de associação para o Amazon ECS
Os exemplos a seguir abrangem casos de uso comuns de uma montagem bind para contêineres.
Para alocar uma quantidade maior de espaço de armazenamento temporário para uma tarefa do Fargate
Para tarefas do Amazon ECS hospedadas no Fargate usando a versão 1.4.0 ou posterior (Linux) ou 1.0.0 (windows) da plataforma, você pode alocar mais do que a quantidade padrão de armazenamento temporário para os contêineres da tarefa que serão usados. Esse exemplo pode ser incorporado aos outros exemplos para alocar mais armazenamento temporário para suas tarefas do Fargate.
-
Na definição da tarefa, defina um objeto
ephemeralStorage. OsizeInGiBdeve ser um número inteiro entre os valores de21e200e é expresso em GiB."ephemeralStorage": { "sizeInGiB":integer}
Para fornecer um volume de dados vazio para um ou mais contêineres
Em alguns casos, você pode querer fornecer aos contêineres de uma tarefa algum espaço temporário. Por exemplo, você pode ter dois contêineres de banco de dados que precisam acessar o mesmo local de armazenamento de arquivos temporários durante uma tarefa. Isso pode ser feito usando uma montagem bind.
-
Na seção
volumesda definição de tarefa, defina uma montagem bind com o nomedatabase_scratch."volumes": [ { "name": "database_scratch" } ] -
Na seção
containerDefinitions, crie as definições de contêiner de banco de dados. Isso deve ser feito para que elas montem o volume."containerDefinitions": [ { "name": "database1", "image": "my-repo/database", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "database_scratch", "containerPath": "/var/scratch" } ] }, { "name": "database2", "image": "my-repo/database", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "database_scratch", "containerPath": "/var/scratch" } ] } ]
Para expor um caminho e seu conteúdo em um Dockerfile para um contêiner
Neste exemplo, você tem um Dockerfile que grava dados que você quer montar em um contêiner. Este exemplo funciona para tarefas hospedadas em instâncias do Fargate ou do Amazon EC2.
-
Crie um Dockerfile. O exemplo a seguir usa a imagem pública do contêiner do Amazon Linux 2 e cria um arquivo denominado
examplefileno diretório/var/log/exportedque queremos montar dentro do contêiner. A diretivaVOLUMEdeve especificar um caminho absoluto.FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN mkdir -p/var/log/exportedRUN touch/var/log/exported/examplefileVOLUME ["/var/log/exported"]Por padrão, as permissões de volume são definidas como
0755e o proprietário comoroot. Essas permissões podem ser alteradas no Dockerfile. No exemplo a seguir, o proprietário do diretório/var/log/exportedé definido comonode.FROM public.ecr.aws/amazonlinux/amazonlinux:latest RUN yum install -y shadow-utils && yum clean all RUN useraddnodeRUN mkdir -p /var/log/exported && chownnode:node/var/log/exported USERnodeRUN touch /var/log/exported/examplefile VOLUME ["/var/log/exported"] -
Na seção
volumesda definição da tarefa, defina um volume com o nomeapplication_logs."volumes": [ { "name": "application_logs" } ] -
Na seção
containerDefinitions, crie as definições do contêiner da aplicação. Isso deve ser feito para que elas montem o armazenamento. O valorcontainerPathdeve corresponder ao caminho absoluto especificado na diretivaVOLUMEdo Dockerfile."containerDefinitions": [ { "name": "application1", "image": "my-repo/application", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "application_logs", "containerPath": "/var/log/exported" } ] }, { "name": "application2", "image": "my-repo/application", "cpu": 100, "memory": 100, "essential": true, "mountPoints": [ { "sourceVolume": "application_logs", "containerPath": "/var/log/exported" } ] } ]
Para fornecer um volume de dados vazio para um contêiner vinculado ao ciclo de vida da instância host do Amazon EC2
Para tarefas hospedadas em instâncias do Amazon EC2, você pode usar montagens bind e ter os dados vinculados ao ciclo de vida da instância host do Amazon EC2. É possível fazer isso usando o parâmetro host e especificando um valor sourcePath. Todos os arquivos existentes em sourcePath são apresentados aos contêineres no valor containerPath. Todos os arquivos que são gravados no valor containerPath são gravados no valor sourcePath na instância do host do Amazon EC2.
Importante
O Amazon ECS não sincroniza seu armazenamento entre instâncias do Amazon EC2. As tarefas que usam armazenamento persistente podem ser colocadas em qualquer instância do Amazon EC2, no cluster que tiver capacidade disponível. Se suas tarefas exigirem armazenamento persistente após a interrupção e a reinicialização, sempre especifique a mesma instância do Amazon EC2 no momento da inicialização da tarefa com o comando start-task da AWS CLI. Também podem ser usados volumes do Amazon EFS para armazenamento persistente. Para obter mais informações, consulte Uso de volumes do Amazon EFS com o Amazon ECS.
-
Na seção
volumesda definição de tarefa, defina uma montagem bind com os valoresnameesourcePath. No exemplo a seguir, a instância host do Amazon EC2 contém dados em/ecs/webdataque você quer montar no contêiner."volumes": [ { "name": "webdata", "host": { "sourcePath": "/ecs/webdata" } } ] -
Na seção
containerDefinitions, defina um contêiner com um valormountPointsque faça referência ao nome da montagem bind definida e ao valorcontainerPathpara montar a montagem bind no contêiner."containerDefinitions": [ { "name": "web", "image": "public.ecr.aws/docker/library/nginx:latest", "cpu": 99, "memory": 100, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webdata", "containerPath": "/usr/share/nginx/html" } ] } ]
Para montar um volume definido em vários contêineres em diferentes locais
É possível definir um volume de dados em uma definição de tarefa e montar esse volume em locais diferentes em diferentes contêineres. Por exemplo, seu contêiner host tem uma pasta de dados de site em /data/webroot. É possível montar esse volume de dados como somente leitura em dois servidores Web diferentes com raízes de documentos distintas.
-
Na seção
volumesde definição de tarefa, defina um volume de dados com o nomewebroote o caminho de origem/data/webroot."volumes": [ { "name": "webroot", "host": { "sourcePath": "/data/webroot" } } ] -
Na seção
containerDefinitions, defina um contêiner para cada servidor da Web com valoresmountPointsque associam o volumewebrootcom o valorcontainerPathapontando para a raiz do documento desse contêiner."containerDefinitions": [ { "name": "web-server-1", "image": "my-repo/ubuntu-apache", "cpu": 100, "memory": 100, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webroot", "containerPath": "/var/www/html", "readOnly": true } ] }, { "name": "web-server-2", "image": "my-repo/sles11-apache", "cpu": 100, "memory": 100, "portMappings": [ { "containerPort": 8080, "hostPort": 8080 } ], "essential": true, "mountPoints": [ { "sourceVolume": "webroot", "containerPath": "/srv/www/htdocs", "readOnly": true } ] } ]
Para montar volumes de outro contêiner usando volumesFrom
Para tarefas hospedadas em instâncias do Amazon EC2, é possível definir um ou mais volumes em um contêiner e, em seguida, usar o parâmetro volumesFrom em uma definição de contêiner diferente (dentro da mesma tarefa) para montar todos os volumes do sourceContainer em seus pontos de montagem definidos originalmente. O parâmetro volumesFrom se aplica a volumes determinados na definição de tarefa, e os que são incorporados na imagem com um Dockerfile.
-
(Opcional) Para compartilhar um volume incorporado em uma imagem, utilize a instrução
VOLUMEno arquivo Dockerfile. O Dockerfile de exemplo a seguir usa uma imagemhttpde, em seguida, adiciona um volume e monta-o emdockerfile_volumena raiz do documento Apache. É a pasta usada pelo servidor Webhttpd.FROM httpd VOLUME ["/usr/local/apache2/htdocs/dockerfile_volume"]É possível incorporar uma imagem com esse Dockerfile e enviá-la para um repositório, como o Docker Hub, e usá-la em sua definição de tarefa. A imagem de exemplo
my-repo/httpd_dockerfile_volumeusada nas etapas a seguir foi criada com o Dockerfile anterior. -
Crie uma definição de tarefa que defina seus outros volumes e pontos de montagem para os contêineres. Nesta seção
volumesde exemplo, você cria um volume vazio chamadoempty, que o daemon do Docker gerencia. Há também um volume host definido que se chamahost_etc. Ele exporta a pasta/etcna instância de contêiner host.{ "family": "test-volumes-from", "volumes": [ { "name": "empty", "host": {} }, { "name": "host_etc", "host": { "sourcePath": "/etc" } } ],Na seção definições de contêiner, crie um contêiner que monte os volumes definidos anteriormente. Neste exemplo, o contêiner
webmonta os volumesemptyehost_etc. Este é o contêiner que utiliza a imagem criada com um volume no Dockerfile."containerDefinitions": [ { "name": "web", "image": "my-repo/httpd_dockerfile_volume", "cpu": 100, "memory": 500, "portMappings": [ { "containerPort": 80, "hostPort": 80 } ], "mountPoints": [ { "sourceVolume": "empty", "containerPath": "/usr/local/apache2/htdocs/empty_volume" }, { "sourceVolume": "host_etc", "containerPath": "/usr/local/apache2/htdocs/host_etc" } ], "essential": true },Crie outro contêiner que use
volumesFrompara montar todos os volumes que estão associados com o contêinerweb. Todos os volumes no contêinerwebtambém são montados no contêinerbusybox. Isso inclui o volume especificado no Dockerfile que foi utilizado para criar a imagemmy-repo/httpd_dockerfile_volume.{ "name": "busybox", "image": "busybox", "volumesFrom": [ { "sourceContainer": "web" } ], "cpu": 100, "memory": 500, "entryPoint": [ "sh", "-c" ], "command": [ "echo $(date) > /usr/local/apache2/htdocs/empty_volume/date && echo $(date) > /usr/local/apache2/htdocs/host_etc/date && echo $(date) > /usr/local/apache2/htdocs/dockerfile_volume/date" ], "essential": false } ] }Quando essa tarefa é executada, os dois contêineres montam os volumes, e o
commandno contêinerbusyboxgrava a data e a hora em um arquivo. Esse arquivo se chamadateem cada uma das pastas de volume. As pastas ficam visíveis no site exibido pelo contêinerweb.nota
Como o contêiner
busyboxexecuta um comando rápido e, em seguida, é encerrado, ele deve ser definido como"essential": falsena definição do contêiner. Caso contrário, ele interromperá toda a tarefa quando for encerrado.