Docker容器在Azure WebApps for Linux上无法正常工作,但它可以在本地使用。

时间:2017-03-21 14:54:41

标签: linux azure docker web-applications

我遇到了docker的Azure Web应用程序(Linux预览版)问题。

我通过go lang写了一个代理服务器并通过Dockerfile打包。这个问题只是将jpeg转换为png格式。它在当地工作正常。

package main

import (
    "net/http"
    "github.com/labstack/echo"
    "io"
    "image"
    "image/jpeg"
    "image/png"
    "log"
)

func main() {
e := echo.New()
e.GET("/convertedimage", func(c echo.Context) error {
    source := c.QueryParam("url")
    log.Printf(source)
    response, err := http.Get(source)
    if err != nil {
        panic(err)
    }
    defer response.Body.Close()
    log.Printf(response.Header.Get("Content-type"));

    if response.Header.Get("Content-type") == "image/jpeg" {
        jpegImage := ImageRead(response.Body)

        pr, pw := io.Pipe()
        go func() {
            err = png.Encode(pw, jpegImage)
            pw.Close()
        }()
        return c.Stream(http.StatusOK, "image/png", pr)
    } else {
        return c.Stream(http.StatusOK, "image/png", response.Body)
    }
})
e.Logger.Fatal(e.Start(":80"))
}

func ImageRead(inputImage io.ReadCloser) (image image.Image) {
    img, err := jpeg.Decode(inputImage)
    if err != nil {
        log.Fatal(err)
    }
    inputImage.Close()
    return img
}

我也是这样通过Docker文件打包的。

FROM golang:1.7.5

ADD server.go .
RUN go get -u github.com/labstack/echo
RUN go build server.go

ENTRYPOINT ./server

EXPOSE 80

但是,当我在Azure网络应用程序(Linux预览版)上部署它时,它不起作用。

$ go build server.go
$ docker build . -t tsuyoshiushio/imageconvertproxy
$ docker push tsuyoshiushio/imageconvertproxy
$ docker run -p 8093:80 tsuyoshiushio/imageconvertproxy

通过这样的浏览器调用它可以正常工作。

http://localhost:8093/convertedimage?url=https%3A%2F%2Fc.s-microsoft.com%2Fja-jp%2FCMSImages%2Fspk-ushio.jpg%3Fversion%3Df6328834-736f-4b59-2f85-7b198346ef4d
-> (I can see a png image on my browser.)

然而,如果我在Azure网络应用上部署它,它根本不起作用。

https://imageproxy.azurewebsites.net/convertedimage?url=https%3A%2F%2Fc.s-microsoft.com%2Fja-jp%2FCMSImages%2Fspk-ushio.jpg%3Fversion%3Df6328834-736f-4b59-2f85-7b198346ef4d
-> {"message":"Not Found"}

它与worng url的行为相同。但是docker容器本身就能成功运行。

现在我们不能把docker exec或docker登录到Web Apps的容器上,我不知道解决这个问题。你对解决这个问题有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您的容器公开端口8093,但默认情况下,App Service使用端口80.幸运的是,此设置是可配置的。

转到“应用程序设置”并添加名为PORT的设置并将其设置为8093.更多信息请参阅此link

更新

我注意到您使用https访问了您的网址,端口是443,而不是80.尝试使用http并再次测试。

答案 1 :(得分:0)

请注意,来自MS(https://docs.microsoft.com/en-us/azure/app-service/containers/app-service-linux-faq)的官方常见问题解答让人觉得您只需要将WEBSITES_PORT设置为容器公开的端口,并且PORT应用程序设置将被删除,但它仍然是非常有用,所以要确保将WEBSITES_PORT和PORT都设置为容器公开的端口。 请注意,无论容器暴露哪个端口,您都可以在端口80上访问Web应用程序以获取HTTP,使用443访问HTTPS。