在Kubernetes Pod中部署phpMyAdmin与Adminer的Entrypoint配置咨询
嘿,我来帮你梳理清楚这个问题!首先得纠正一个小误区,然后一步步解决Entrypoint的配置,最后给你K8s Pod的配置参考。
先搞懂容器镜像的核心逻辑
你最开始写的Dockerfile用了两次FROM,这其实是多阶段构建的语法,最终只会生成基于最后一个FROM(也就是adminer:4)的镜像,根本不会把两个服务打包到同一个容器里。所以你后来拆分两个独立的Dockerfile(对应两个容器)的方向完全正确——Kubernetes的Pod本来就支持在里面放多个容器,每个容器跑一个独立的服务。
分别配置两个镜像的Entrypoint
其实官方镜像都已经帮你配置好了默认的启动命令,大部分情况下你根本不需要自己写ENTRYPOINT,除非有特殊的自定义需求。
1. phpMyAdmin镜像的Entrypoint处理
官方的phpmyadmin/phpmyadmin镜像基于Apache,默认的启动命令就是前台运行Apache,这样容器才能保持存活状态。你完全可以删掉自己写的ENTRYPOINT [ "executable" ],直接用官方默认的配置就行。如果非要显式写出来,那就是:
FROM phpmyadmin/phpmyadmin # 你的环境变量配置保持不变 ENV MYSQL_DATABASE=${MYSQL_DATABASE} ENV MYSQL_USER=${MYSQL_USERNAME} ENV MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD} ENV MYSQL_PORT=3381 ENV PMA_USER=${MYSQL_USER} ENV PMA_PORT=3381 ENV PMA_PASSWORD=${MYSQL_PASSWORD} ENV PMA_HOST=${MYSQL_HOST} EXPOSE 8081 # 显式指定官方默认的Entrypoint/CMD ENTRYPOINT ["apache2-foreground"]
注意:如果你的
EXPOSE 8081是想让phpMyAdmin监听8081端口,那你还需要修改Apache的配置文件(比如在Dockerfile里添加修改000-default.conf的步骤),因为官方镜像默认监听的是80端口。
2. Adminer镜像的Entrypoint处理
官方的adminer:4镜像用的是PHP内置服务器启动服务,默认监听8080端口。同样,你不需要自己写ENTRYPOINT [ "?" ],用默认的就行。如果要改成监听8082端口(对应你写的EXPOSE 8082),那可以显式修改CMD:
FROM adminer:4 # 你的环境变量配置保持不变 ENV POSTGRES_DB=${POSTGRES_DATABASE} ENV POSTGRES_USER=${POSTGRES_USER} ENV POSTGRES_PASSWORD=${POSTGRES_PASSWORD} EXPOSE 8082 # 显式指定监听8082端口的启动命令 CMD ["php", "-S", "[::]:8082", "-t", "/var/www/html"]
Kubernetes Pod的完整配置示例
现在你可以用这两个构建好的镜像,创建一个包含两个容器的K8s Pod,下面是参考配置:
apiVersion: v1 kind: Pod metadata: name: db-admin-tools spec: containers: - name: phpmyadmin image: 你的phpmyadmin镜像标签(比如my-phpmyadmin:v1) ports: - containerPort: 8081 # 要和镜像内部监听的端口一致 env: # 建议用ConfigMap和Secret管理配置,不要硬编码 - name: MYSQL_DATABASE valueFrom: configMapKeyRef: name: db-config key: mysql-db-name - name: MYSQL_USERNAME valueFrom: secretKeyRef: name: db-secrets key: mysql-username - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: db-secrets key: mysql-password - name: PMA_HOST valueFrom: configMapKeyRef: name: db-config key: mysql-host - name: PMA_PORT value: "3381" - name: adminer image: 你的adminer镜像标签(比如my-adminer:v1) ports: - containerPort: 8082 # 要和镜像内部监听的端口一致 env: - name: POSTGRES_DATABASE valueFrom: configMapKeyRef: name: db-config key: postgres-db-name - name: POSTGRES_USER valueFrom: secretKeyRef: name: db-secrets key: postgres-username - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: db-secrets key: postgres-password
小提示:在K8s里,敏感信息(比如密码)一定要用Secret存储,非敏感配置(比如数据库名称、地址)用ConfigMap,这样既安全又方便后续修改。
几个额外的注意点
- 确保镜像内部监听的端口和你
EXPOSE、K8s Pod里containerPort配置的端口一致,不然会出现访问不通的问题。 - 如果是私有镜像,记得在Pod里配置
imagePullSecrets,让K8s能拉取到你的镜像。 - 同一个Pod里的两个容器可以通过
localhost互相访问,但它们是完全独立的进程,各自管理自己的生命周期。
内容的提问来源于stack exchange,提问作者Mike3355

