func (fetcher *dockerMetadataFetcher) FetchMetadata(dockerPath string) (*ImageMetadata, error) {
	indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference(dockerPath)
	if err != nil {
		return nil, err
	}

	var reposName string
	if len(indexName) > 0 {
		reposName = fmt.Sprintf("%s/%s", indexName, remoteName)
	} else {
		reposName = remoteName
	}

	var session DockerSession
	if session, err = fetcher.dockerSessionFactory.MakeSession(reposName, false); err != nil {
		if !strings.Contains(err.Error(), "this private registry supports only HTTP or HTTPS with an unknown CA certificate") {
			return nil, err
		}

		session, err = fetcher.dockerSessionFactory.MakeSession(reposName, true)
		if err != nil {
			return nil, err
		}
	}

	repoData, err := session.GetRepositoryData(remoteName)
	if err != nil {
		return nil, err
	}

	tagsList, err := session.GetRemoteTags(repoData.Endpoints, remoteName, repoData.Tokens)
	if err != nil {
		return nil, err
	}

	imgID, ok := tagsList[tag]
	if !ok {
		return nil, fmt.Errorf("Unknown tag: %s:%s", remoteName, tag)
	}

	var img *image.Image
	endpoint := repoData.Endpoints[0]
	imgJSON, _, err := session.GetRemoteImageJSON(imgID, endpoint, repoData.Tokens)
	if err != nil {
		return nil, err
	}

	img, err = image.NewImgJSON(imgJSON)
	if err != nil {
		return nil, fmt.Errorf("Error parsing remote image json for specified docker image:\n%s", err)
	}
	if img.Config == nil {
		return nil, fmt.Errorf("Parsing start command failed")
	}

	startCommand := append(img.Config.Entrypoint, img.Config.Cmd...)
	exposedPorts := sortPorts(img.ContainerConfig.ExposedPorts)

	return &ImageMetadata{
		WorkingDir:   img.Config.WorkingDir,
		User:         img.Config.User,
		StartCommand: startCommand,
		ExposedPorts: exposedPorts,
		Env:          img.Config.Env,
	}, nil
}
				_, err := docker_repository_name_formatter.FormatForReceptor("¥¥¥¥¥suchabadname¥¥¥¥¥")
				Expect(err).To(MatchError("Invalid repository name (¥¥¥¥¥suchabadname¥¥¥¥¥), only [a-z0-9-_.] are allowed"))
			})

			It("returns an error for an invalid namespace name", func() {
				_, err := docker_repository_name_formatter.FormatForReceptor("jim/my-docker-app")
				Expect(err).To(MatchError("Invalid namespace name (jim). Cannot be fewer than 4 or more than 30 characters."))
			})
		})
	})

	Describe("ParseRepoNameAndTagFromImageReference", func() {
		Context("with a well-formed docker repo name", func() {
			Context("with a shortened official docker repo name", func() {
				It("parses the repo and tag from a docker image reference", func() {
					indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference("my-docker-app:test")
					Expect(err).NotTo(HaveOccurred())
					Expect(indexName).To(BeEmpty())
					Expect(remoteName).To(Equal("library/my-docker-app"))
					Expect(tag).To(Equal("test"))
				})

				It("parses the repo and defaults tag to latest for docker image reference without a tag", func() {
					indexName, remoteName, tag, err := docker_repository_name_formatter.ParseRepoNameAndTagFromImageReference("my-docker-app")
					Expect(err).NotTo(HaveOccurred())
					Expect(indexName).To(BeEmpty())
					Expect(remoteName).To(Equal("library/my-docker-app"))
					Expect(tag).To(Equal("latest"))
				})
			})