我遇到了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的容器上,我不知道解决这个问题。你对解决这个问题有什么想法吗?
答案 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。