Home > Back-end >  docker pull <image> not working in cloudformation UserData tag
docker pull <image> not working in cloudformation UserData tag

Time:12-01

UserData:
  'Fn::Base64': |
    #!/bin/bash
    yum -y install docker
    dockerd
    docker pull apache/superset

In above mentioned Cloudformation UserData tag: Everything works up until dockerd. docker pull command doesnt execute. Template doesnt generate any error. But when I ssh into the ec2 instance created by my cloudformation template - I dont see the docker image. I am able to manually run docker pull <image> on ec2 and it works.

Is there any specific setting required to pull an image from docker hub (not ECR) on ec2 from cloud formation template?

My entire CF template for reference:

Parameters:
  InstanceType:
    Type: String
    Default: t2.micro
    Description: Enter instance size. Default is t3a.medium.
    AllowedValues: # dropdown options
      - t1.nano
      - t1.micro
      - t2.micro
  Key:
    Type: AWS::EC2::KeyPair::KeyName
    Default: aseem-ec2-eu-west-1
    Description: The key used to access the instance.

Mappings:
  AmiIdForRegion:
    us-east-1:
      AMI: ami-04ad2567c9e3d7893
    eu-west-1:
      AMI: ami-09d4a659cdd8677be

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 172.34.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      InstanceTenancy: default
      Tags:
        - Key: Name
          Value: Linux VPC
  InternetGateway:
    Type: AWS::EC2::InternetGateway
  VPCGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway
  SubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: eu-west-1a
      VpcId: !Ref VPC
      CidrBlock: 172.34.1.0/24
      MapPublicIpOnLaunch: true
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  InternetRoute:
    Type: AWS::EC2::Route
    DependsOn:
      - InternetGateway
      - VPCGatewayAttachment
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
      RouteTableId: !Ref RouteTable

  SubnetARouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref SubnetA

  SecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupDescription: Enable HTTP access via port 80
      GroupName: superset-ec2-security-group-3
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 8080 # HTTP- port 80
          ToPort: 8080
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22 # ssh
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
      SecurityGroupEgress: # all external traffic
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0
  ElasticIP:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
      InstanceId: !Ref LinuxEc2

  LinuxEc2:
    Type: AWS::EC2::Instance
    Properties:
      SubnetId: !Ref SubnetA
      SecurityGroupIds:
        - !Ref SecurityGroup
      ImageId: !FindInMap [ AmiIdForRegion,!Ref AWS::Region,AMI ]
      KeyName: !Ref Key
      InstanceType: !Ref InstanceType
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 100
      Tags:
        - Key: Name # naming your instance
          Value: superset-6
      UserData:
        'Fn::Base64': |
          #!/bin/bash
          yum -y install docker
          dockerd
          docker pull apache/superset


Outputs:
  PublicDnsName:
    Value: !GetAtt LinuxEc2.PublicDnsName
  PublicIp:
    Value: !GetAtt LinuxEc2.PublicIp

CodePudding user response:

You shouldn't execute dockerd in your user data. This starts the docker daemon and freezes further executions. Instead it should be:

      UserData:
        'Fn::Base64': |
          #!/bin/bash
          yum -y install docker
          systemctl enable docker
          systemctl start docker
          docker pull apache/superset
  • Related