preguntas más frecuentes sobre Azure App Service en Linux

Con el lanzamiento de App Service en Linux, estamos trabajando para agregar características y realizar mejoras en nuestra plataforma. En este artículo se proporcionan respuestas a las preguntas que nuestros clientes nos han estado preguntando recientemente.

Si tiene alguna pregunta, comente este artículo.

Imágenes integradas

Quiero bifurcar los contenedores de Docker integrados que proporciona la plataforma. ¿Dónde puedo encontrar esos archivos?

Puede encontrar todos los archivos de Docker en GitHub.

¿Cuáles son los valores esperados para la sección Archivo de inicio al configurar la pila en tiempo de ejecución?

Pila Valor esperado
Java SE el comando para iniciar la aplicación JAR (por ejemplo, java -jar /home/site/wwwroot/app.jar --server.port=80)
Tomcat la ubicación de un script para realizar las configuraciones necesarias (por ejemplo, /home/site/deployments/tools/startup_script.sh)
Node.js el archivo de configuración pm2 o el archivo de script
.NET Core el nombre dll compilado como dotnet <myapp>.dll
PHP inicio personalizado opcional
Python script de inicio opcional
Ruby el script de Ruby con el que desea inicializar la aplicación

Estos comandos o scripts se ejecutan después de iniciar el contenedor de Docker integrado, pero antes de que se inicie el código de la aplicación.

Administración

¿Qué ocurre cuando presione el botón de reinicio en el Azure Portal?

Esta acción es la misma que un reinicio de Docker.

¿Puedo usar Secure Shell (SSH) para conectarme a la máquina virtual (VM) del contenedor de aplicaciones?

Sí, puede hacerlo a través del sitio de administración de control de código fuente (SCM).

Nota:

También puede conectarse al contenedor de aplicaciones directamente desde la máquina de desarrollo local mediante SSH, SFTP o Visual Studio Code (para la depuración en vivo Node.js aplicaciones). Para obtener más información, vea Depuración remota y SSH en App Service en Linux.

¿Cómo puedo crear un plan de App Service de Linux a través de un SDK o una plantilla de Azure Resource Manager?

Establezca el campo reservado de App Service en true.

Integración e implementación continuas

Mi aplicación web sigue usando una imagen de contenedor de Docker antigua después de actualizar la imagen en Docker Hub. ¿Admite la integración e implementación continuas de contenedores personalizados?

Sí, para configurar la integración o implementación continuas para Azure Container Registry o DockerHub, siga Implementación continua con Web App for Containers. Para los registros privados, puede actualizar el contenedor deteniendo e iniciando la aplicación web. También puede cambiar o agregar una configuración de aplicación ficticia para forzar una actualización del contenedor.

¿Admite entornos de ensayo?

Sí.

¿Puedo usar "WebDeploy/MSDeploy" para implementar mi aplicación web?

Sí, debe establecer una configuración de aplicación llamada WEBSITE_WEBDEPLOY_USE_SCM a false.

Se produce un error en la implementación de Git de mi aplicación cuando se usa la aplicación web Linux. ¿Cómo puedo solucionar el problema?

Si se produce un error en la implementación de Git en la aplicación web Linux, elija una de las siguientes opciones para implementar el código de la aplicación:

  • Use la característica Entrega continua (versión preliminar): puede almacenar el código fuente de la aplicación en un repositorio de Git de Azure DevOps o en un repositorio de GitHub para usar la entrega continua de Azure. Para obtener más información, consulte Configuración de la entrega continua para la aplicación web Linux.

  • Use la API de implementación de ZIP: para usar esta API, use SSH en la aplicación web y vaya a la carpeta donde desea implementar el código. Ejecute el siguiente código:

    curl -X POST -u <user> --data-binary @<zipfile> https://{your-sitename}.scm.azurewebsites.net/api/zipdeploy
    

    Si recibe un error que indica que no se encuentra el curl comando, asegúrese de instalar curl mediante apt-get install curl antes de ejecutar el comando anterior curl .

Compatibilidad con idiomas

¿Desea usar sockets web en mi aplicación de Node.js, cualquier configuración especial o configuraciones para establecer?

Sí, deshabilite perMessageDeflate el código de Node.js del lado servidor. Por ejemplo, si usa socket.io, use el código siguiente:

const io = require('socket.io')(server,{
  perMessageDeflate :false
});

¿Admite aplicaciones de .NET Core sin compilar?

Sí.

¿Admite Composer como administrador de dependencias para aplicaciones PHP?

Sí, durante una implementación de Git, Kudu debe detectar que está implementando una aplicación PHP (gracias a la presencia de un archivo composer.lock) y Kudu desencadenará una instalación de composer.

Contenedores personalizados

¿Puedo usar identidades administradas con App Service al extraer imágenes de ACR?

Sí, esta funcionalidad está disponible en la CLI de Azure. Puede usar identidades asignadas por el sistema o asignadas por el usuario . Esta funcionalidad no se admite actualmente en el Azure Portal.

Estoy usando mi propio contenedor personalizado. Quiero que la plataforma monte un recurso compartido SMB en el directorio "/home/".

Si WEBSITES_ENABLE_APP_SERVICE_STORAGE la configuración no está especificada o se establece en false, el /home/ directorio no se compartirá entre las instancias de escalado y los archivos escritos no se conservarán entre los reinicios. Establecer explícitamente WEBSITES_ENABLE_APP_SERVICE_STORAGE en true habilitará el montaje. Una vez establecido en true, si desea deshabilitar el montaje, debe establecer explícitamente en WEBSITES_ENABLE_APP_SERVICE_STORAGEfalse.

Mi contenedor no se puede iniciar con "no queda espacio en el dispositivo". ¿Qué significa este error?

App Service en Linux usa dos tipos diferentes de almacenamiento:

  • Almacenamiento del sistema de archivos: el almacenamiento del sistema de archivos se incluye en la cuota del plan de App Service. Se usa cuando los archivos se guardan en el almacenamiento persistente que se basa en el /home directorio.
  • Espacio en disco del host: el espacio en disco del host se usa para almacenar imágenes de contenedor. Lo administra la plataforma a través del controlador de almacenamiento de Docker.

El espacio en disco del host es independiente de la cuota de almacenamiento del sistema de archivos. No se puede expandir y hay un límite de 15 GB para cada instancia. Se usa para almacenar las imágenes personalizadas en el trabajo. Es posible que pueda usar más de 15 GB en función de la disponibilidad exacta del espacio en disco del host, pero esto no está garantizado.

Si la capa grabable del contenedor guarda datos fuera del /home directorio o una ruta de acceso de Azure Storage montada, también se consumirá el espacio en disco del host.

La plataforma limpia de forma rutinaria el espacio en disco del host para quitar los contenedores sin usar. Si el contenedor escribe una gran cantidad de datos fuera del /home directorio o Bring Your Own Storage (BYOS), se producirán errores de inicio o excepciones en tiempo de ejecución una vez que se supere el límite de espacio en disco del host.

Se recomienda mantener las imágenes de contenedor lo más pequeñas posible y escribir datos en el almacenamiento persistente o BYOS cuando se ejecuten en Linux App Service. Si no es posible, tiene que dividir el plan de App Service porque el espacio en disco del host es fijo y compartido entre todos los contenedores del plan de App Service.

El contenedor personalizado tarda mucho tiempo en iniciarse y la plataforma reinicia el contenedor antes de que termine de iniciarse.

Puede configurar la cantidad de tiempo que la plataforma esperará antes de reiniciar el contenedor. Para ello, establezca la configuración de la WEBSITES_CONTAINER_START_TIME_LIMIT aplicación en el valor que desee. El valor predeterminado es 230 segundos y el valor máximo es 1800 segundos.

¿Cuál es el formato de la dirección URL del servidor del Registro privado?

Proporcione la dirección URL completa del Registro, incluido http:// o https://.

¿Cuál es el formato del nombre de la imagen en la opción del Registro privado?

Agregue el nombre completo de la imagen, incluida la dirección URL del Registro privado (por ejemplo, myacr.azurecr.io/dotnet:latest). Los nombres de imagen que usan un puerto personalizado no se pueden escribir a través del portal. Para establecer docker-custom-image-name, use la az herramienta de línea de comandos.

¿Puedo exponer más de un puerto en mi imagen de contenedor personalizada?

No se admite la exposición de más de un puerto.

¿Puedo traer mi propio almacenamiento?

Sí, traiga su propio almacenamiento en versión preliminar.

¿Por qué no puedo examinar el sistema de archivos del contenedor personalizado o ejecutar procesos desde el sitio de SCM?

El sitio scm se ejecuta en un contenedor independiente. No se puede comprobar el sistema de archivos ni los procesos en ejecución del contenedor de aplicaciones.

¿Es necesario implementar HTTPS en mi contenedor personalizado?

No, la plataforma controla la terminación HTTPS en los front-end compartidos.

¿Necesito usar WEBSITES_PORT para contenedores personalizados?

Sí, esto es necesario para contenedores personalizados. Para configurar manualmente un puerto personalizado, use la instrucción EXPOSE en dockerfile y la configuración de la aplicación, WEBSITES_PORT, con un valor de puerto para enlazar en el contenedor.

¿Puedo usar ASPNETCORE_URLS en la imagen de Docker?

Sí, sobrescriba la variable de entorno antes de que se inicie la aplicación .NET Core. Por ejemplo, en el script de init.sh: export ASPNETCORE_URLS={Your value}

Varios contenedores con Docker Compose

Cómo configurar Azure Container Registry (ACR) para usarlos con varios contenedores?

Para usar ACR con varios contenedores, todas las imágenes de contenedor deben hospedarse en el mismo servidor del registro de ACR. Una vez que estén en el mismo servidor del Registro, deberá crear la configuración de la aplicación y, a continuación, actualizar el archivo de configuración de Docker Compose para incluir el nombre de la imagen de ACR.

Cree la siguiente configuración de aplicación:

  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_URL (dirección URL completa, por ejemplo: https://<server-name>.azurecr.io)
  • DOCKER_REGISTRY_SERVER_PASSWORD (habilitar el acceso de administrador en la configuración de ACR)

En el archivo de configuración, haga referencia a la imagen de ACR como en el ejemplo siguiente:

image: <server-name>.azurecr.io/<image-name>:<tag>

Cómo saber qué contenedor es accesible a Internet?

  • Solo un contenedor puede estar abierto para el acceso
  • Solo se puede acceder a los puertos 80 y 8080 (puertos expuestos)

Estas son las reglas para determinar qué contenedor es accesible, en el orden de precedencia:

  • Configuración de la aplicación WEBSITES_WEB_CONTAINER_NAME establecida en el nombre del contenedor
  • El primer contenedor que define el puerto 80 o 8080
  • Si ninguno de los anteriores es true, se podrá acceder al primer contenedor definido en el archivo (expuesto)

Cómo usar depends_on?

La depends_on opción no se admite en App Service y se omitirá. Al igual que la recomendación de inicio y apagado del control de Docker, App Service aplicaciones de varios contenedores deben comprobar las dependencias a través del código de la aplicación, tanto en el inicio como en la desconexión. En el código de ejemplo siguiente se muestra una comprobación de aplicaciones de Python para ver si se está ejecutando un contenedor de Redis.

import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello from Azure App Service team! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

Web Sockets

Los sockets web se admiten en aplicaciones Linux. La webSocketsEnabled configuración de ARM no se aplica a las aplicaciones Linux, ya que los sockets web siempre están habilitados para Linux.

Importante

Los sockets web ahora se admiten para aplicaciones Linux en planes de App Service gratuitos. Se admiten hasta cinco conexiones de socket web en planes de App Service gratis. Si se supera este límite, se genera una respuesta HTTP 429 (demasiadas solicitudes).

Precios y acuerdos de nivel de servicio

¿Cuál es el precio, ahora que el servicio está disponible con carácter general?

Los precios varían según la SKU y la región, pero puede ver más detalles en nuestra página de precios: App Service Precios.

Otras preguntas

¿Cómo funciona la solicitud de preparación del contenedor?

Cuando App de Azure Services inicia el contenedor, la solicitud de preparación envía una solicitud HTTP al punto de conexión /robots933456.txt de la aplicación. Se trata simplemente de un punto de conexión ficticio, pero la aplicación debe responder con cualquier código de estado que no sea 5XX. Si la lógica de la aplicación no responde con ningún código de estado HTTP a puntos de conexión inexistentes, la solicitud de preparación no puede recibir una respuesta y reinicia el contenedor de forma permanente. La solicitud de preparación también puede producir un error debido a una configuración incorrecta del puerto.

Para asegurarse de que el puerto está configurado correctamente en App de Azure Services, consulte la pregunta Cómo especificar el puerto en el contenedor de Linux.

¿Es posible aumentar el tiempo de espera de la solicitud de preparación del contenedor?

De forma predeterminada, se produce un error en la solicitud de preparación después de esperar 240 segundos para obtener una respuesta del contenedor. Puede aumentar el tiempo de espera de la solicitud de preparación del contenedor agregando la configuración WEBSITES_CONTAINER_START_TIME_LIMIT de la aplicación con un valor entre 240 y 1800 segundos.

Cómo especificar el puerto en mi contenedor linux?

Tipo de contenedor Descripción Cómo establecer o usar el puerto
Contenedores integrados Si selecciona una versión de lenguaje o marco para una aplicación Linux, se selecciona automáticamente un contenedor predefinido. Para apuntar el código de la aplicación al puerto correcto, use la variable de entorno PORT.
Contenedores personalizados Tiene control total sobre el contenedor. App Service no tiene ningún control sobre el puerto en el que escucha el contenedor. Lo que necesita es saber a qué puerto reenviar solicitudes. Si el contenedor escucha el puerto 80 o 8080, App Service puede detectarlo automáticamente. Si escucha cualquier otro puerto, debe establecer la configuración de la aplicación de WEBSITES_PORT en el número de puerto y App Service reenvía las solicitudes a ese puerto en el contenedor. La configuración de la aplicación WEBSITES_PORT no tiene ningún efecto dentro del contenedor y no se puede acceder a ella como una variable de entorno dentro del contenedor.

¿Puedo usar una base de datos basada en archivos (como SQLite) con mi aplicación web linux?

El sistema de archivos de la aplicación es un recurso compartido de red montado. Esto permite escalar horizontalmente escenarios en los que el código debe ejecutarse en varios hosts. Desafortunadamente, esto bloquea el uso de proveedores de bases de datos basados en archivos como SQLite, ya que no es posible adquirir bloqueos exclusivos en el archivo de base de datos. Se recomienda un servicio de base de datos administrada: Azure SQL, Azure Database for MySQL o Azure Database for PostgreSQL

¿Cuáles son los caracteres admitidos en los nombres de configuración de la aplicación?

Solo puede usar letras (A-Z, a-z), números (0-9) y el carácter de subrayado (_) para la configuración de la aplicación.

¿Dónde puedo solicitar nuevas características?

Puede enviar su idea en el foro de comentarios de Web Apps. Agregue "[Linux]" al título de la idea.