因此,我使用 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 文件,因此我们在这里看不到完整的情况。