Dockerfile 和 Kubernetes - COPY 功能似乎不起作用(部署时文件不在 Pod 中)

Dockerfile 和 Kubernetes - COPY 功能似乎不起作用(部署时文件不在 Pod 中)

因此,我使用 Docker for Desktop 在我的 macOS 上运行本地 Kubernetes 集群。

我正在设置一个想要在本地测试的 Kubernetes 集群,但是在将其他本地文件夹复制到源映像时遇到了一些问题。

我的Dockerfile非常简单:

FROM wordpress:latest

WORKDIR /var/www/html

# Copy wp-content
COPY ./wp-content/ ./wp-content/ # I don't find the /wp-content/ in my container/image/pod once deployed, but I do find it if I run just the docker image

在我的所属目录中Dockerfile,我有一个wp-content文件夹,我希望在容器构建完成后在容器上看到它。

当我运行docker build -t johndoe/wordpress:<someUniqueVersion>docker push johndoe/wordpress:<versionTag>看到存储库时,我还发现它比官方 WordPress 图像大得多(因此某些文件一定是被复制过来的)。

但是,当我更新我的 Kubernetes 部署 yaml 配置文件以使用我刚刚推送的特定版本,然后运行 ​​时kubectl apply wordpress-deployment.yaml,我看到 POD 重新启动并使用正确的 Docker 映像提交 ( kubectl get pods <podname> -o jsonpath="{..imageID}"),但如果我这样做并查看文件,则文件不存在kubectl exec <podname> -it sh。所有其他 WordPress 文件(来自原生 WordPress 映像)都在那里,但我告诉 Docker 专门复制的文件不存在。

我也尝试find / -name "myfile"对整个文件系统进行操作,以防文件被复制到其他地方,但它根本不在图像上。

顺利docker build完成:

[+] Building 27.7s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                     0.0s
 => => transferring dockerfile: 380B                                                                                                                                                                                                                     0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                        0.0s
 => => transferring context: 2B                                                                                                                                                                                                                          0.0s
 => [internal] load metadata for docker.io/library/wordpress:latest                                                                                                                                                                                      0.0s
 => [1/3] FROM docker.io/library/wordpress:latest                                                                                                                                                                                                        0.0s
 => [internal] load build context                                                                                                                                                                                                                        8.9s
 => => transferring context: 190.57MB                                                                                                                                                                                                                    8.8s
 => CACHED [2/3] WORKDIR /var/www/html                                                                                                                                                                                                                   0.0s
 => [3/3] COPY ./wp-content ./                                                                                                                                                                                                                           8.7s
 => exporting to image                                                                                                                                                                                                                                   9.3s
 => => exporting layers                                                                                                                                                                                                                                  9.3s
 => => writing image sha256:7b567cfc8609661edfcc6495df25ba448c9b85957av3692184beca3e6h9ce8c7                                                                                                                                                             0.0s
 => => naming to docker.io/johndone/wordpress:v1.7

我也尝试过的事情:

  • 删除 PVC/PV 容量声明,以防出现问题
  • 尝试了不同的 COPY 变体(例如COPY ./wp-content/ ./wp-content/COPY ./wp-content/ /var/www/html/wp-content
  • 尝试复制单个测试文件,如下所示:COPY ./test /var/www/html但是,这也没有出现。
  • 确保目录不存在于中.dockerignore。我甚至尝试完全重命名该文件以确保它不会成为问题。

更新

我的 wordpress-deployment.yaml 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      component: wordpress
  template: 
    metadata:
      labels: 
        component: wordpress
    spec:
      volumes:
        - name: wordpress-storage
          persistentVolumeClaim:
            claimName: wordpress-persistent-volume-claim
      containers:
        - name: wordpress
          image: myusername/wordpress:v1.7.2
          ports:
            - containerPort: 8000
          env:
            - name: WORDPRESS_DB_HOST
              value: db-cluster-ip-service:3306
            - name: WORDPRESS_DB_USER
              value: wordpress
            - name: WORDPRESS_DB_NAME
              value: thedatabase
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: dbpassword
                  key: MYSQL_PASSWORD
            - name: WORDPRESS_DEBUG
              value: "1"
            - name: WORDPRESS_TABLE_PREFIX
              value: wp_
          volumeMounts:
            - name: wordpress-storage
              mountPath: /var/www/html
              subPath: wordpress
      imagePullSecrets:
        - name: regcred

我的 WordPress 持久卷声明文件:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-persistent-volume-claim
spec:
  accessModes: 
    - ReadWriteMany
  resources:
    requests:
      storage: 6Gi

答案1

这里的问题是,你正在用 pvc 替换你的 html 目录(你复制的文件所在的目录)。pvc 不包含这些新文件,因此它们不会出现

答案2

我使用 docker 19.03.13 对此进行了测试,并使用了您的 dockerfile,并且复制对我来说工作正常。但是我在构建映像时确实收到了错误:

When using COPY with more than one source file, the destination must be a directory and end with a /

我通过删除/并保留.目的地解决了这个问题,因此您可能需要尝试目标路径并检查其他可能性(我在 Linux 机器上的 docker 上测试了这个问题)。

由于您在问题中提到了 PV/PVC,我怀疑最可能的原因是,您正在将卷安装在复制文件应该所在的位置。因此,您的 PVC 位于您希望文件所在的位置。

话虽如此,由于我们看不到您的 yaml 文件,因此我们在这里看不到完整的情况。

相关内容