如何创建一个“DOCKER文件”来容器化一个“Flutter”应用,以便将其部署到Kubernetes集群上?

a64a0gku  于 2023-01-16  发布在  Kubernetes
关注(0)|答案(1)|浏览(330)

我只是想知道我应该如何为Flutter应用程序创建一个docker文件,然后将其部署在Kubernetes集群上?
我从this网站找到了以下Dockerfileserver.sh脚本,但我不确定这是否是正确的方法?

# Install Operating system and dependencies
FROM ubuntu:22.04

RUN apt-get update 
RUN apt-get install -y curl git wget unzip libgconf-2-4 gdb libstdc++6 libglu1-mesa fonts-droid-fallback lib32stdc++6 python3
RUN apt-get clean

# download Flutter SDK from Flutter Github repo
RUN git clone https://github.com/flutter/flutter.git /usr/local/flutter

# Set flutter environment path
ENV PATH="/usr/local/flutter/bin:/usr/local/flutter/bin/cache/dart-sdk/bin:${PATH}"

# Run flutter doctor
RUN flutter doctor

# Enable flutter web
RUN flutter channel master
RUN flutter upgrade
RUN flutter config --enable-web

# Copy files to container and build
RUN mkdir /app/
COPY . /app/
WORKDIR /app/
RUN flutter build web

# Record the exposed port
EXPOSE 5000

# make server startup script executable and start the web server
RUN ["chmod", "+x", "/app/server/server.sh"]

ENTRYPOINT [ "/app/server/server.sh"]

以及:

#!/bin/bash

# Set the port
PORT=5000

# Stop any program currently running on the set port
echo 'preparing port' $PORT '...'
fuser -k 5000/tcp

# switch directories
cd build/web/

# Start the server
echo 'Server starting on port' $PORT '...'
python3 -m http.server $PORT

我做了所有的步骤,它似乎工作正常,但只要我使用skaffold,我不知道如何/在哪里把下面的命令自动化这一步(我已经手动运行这个命令):

docker run -i -p 8080:5000 -td flutter_docker

我仍然想知道是上述文件,正确/官方的方式来做,还是有一个更好的方式?

EDIT:我创建了以下deployment & service文件,以将创建的映像部署到Kubernetes本地Kind群集上,但在运行kubectl get pods时找不到此映像,但我通过执行docker images找到了它。为什么会发生这种情况,以及如何放置到Kubernetes pod上,而不是docker映像上?

apiVersion: apps/v1
kind: Deployment
metadata:
  name: client-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: client
  template:
    metadata:
      labels:
        app: client
    spec:
      containers:
        - name: client
          image: front
---
apiVersion: v1
kind: Service
metadata:
  name: client-srv
spec:
  selector:
    app: client
  ports:
    - name: client
      protocol: TCP
      port: 3000
      targetPort: 3000
blmhpbnm

blmhpbnm1#

这个问题(标题)有误导性。有两个部分。
1.如何容器化应用程序(在本例中为flutter应用程序)。
1.如何在k8s集群上部署应用程序。
要处理第一部分,您有Dockerfile。有改进的空间,但我认为这个Dockerfile应该工作。然后您需要构建一个容器映像。请参考official documentation。最后,您需要将创建的容器映像推送到某个存储库。(我们可以跳过此推送阶段,但为了简化操作,我建议推送映像)
对于第二部分,您应该熟悉Kubernetes的基本概念。您可以在k8s Pod object的帮助下从以前构建的容器映像运行容器。要访问应用程序,您还需要一个k8s对象,即Service(负载平衡器或节点端口类型)。
我知道事情有点复杂(在最初的水平),但请遵循一个很好的课程/书籍我已经看过了你分享的博客文章,这只谈了第一部分,而不是第二部分。你会在这篇博客文章的结尾有一个容器的形象。
我建议你去看看killer shell提供的免费的Playground,如果你不想自己建立一个k8s集群,那又是另一个学习曲线。跳过这个页面的第一个磁贴这只是一个Playground,但从第二个磁贴开始,他们有足够的材料。

已编辑问题的改进:

  • server.sh:如果你有复杂的启动逻辑,维护一个启动脚本是相当标准的做法。我们可以跳过这个文件,但在这种情况下,一些步骤将被添加到Dockerfile。
  • kubectl get pods不会显示图像,但会显示集群中正在运行的pod(在默认名称空间中)。不确定您是如何运行和连接到集群的。但请尝试添加命令的输出。
  • imve dockerfile的一些指针:
  • 使用较小的基础映像占用空间。Ubuntu:xx有很多预装的软件包,也许你不需要所有的。Ubuntu也有slim镜像或者试着找一个flutter镜像。
  • 尽量减少运行语句。你可以俱乐部2-3命令在一个。这将减少层的形象。
  • 你应该在构建docker之前克隆代码,并在容器映像中复制/添加代码,而不是RUN git clone。这样,你就可以控制需要添加到映像中的文件,也不需要在容器映像中安装git工具。
  • 如果您巧妙地编写Dockerfile,则根本不需要RUN ["chmod", "+x", "/app/server/server.sh"]RUN mkdir这两条语句。
  • Dockerfiles应该干净、清晰、精确。

PS:抱歉,但这不是课堂部分。我知道这对初学者来说有点复杂。但请尝试从一些好的来源/书籍中学习。

相关问题