1

项目文件

./
├── Dockerfile
├── env.php
├── index.php
└── runtime
    ├── cache
    └── logs

Dockerfile

# 基础镜像
FROM php:7.4-cli

# 执行 docker build 命令的目录为构建的根目录
# COPY 基于此根目录进行文件复制
# /runtime 并非宿主机的文件路径 而是当前构建目录为根目录的虚拟文件系统
COPY . /apps/demo
COPY /runtime /apps/demo/runtime

# 工作目录
WORKDIR /apps/demo

# 构建运行时参数 只作用在 build and run
ARG ARG_1=hello
ARG ARG_2=world

RUN echo "ARG defines var only in building runtime: $ARG_1 $ARG_2"

# 环境变量 可以在 run 时使用 -e name=val 来覆盖
# 且容器内可访问
ENV APP_NAME=""
ENV APP_VER="0.0.1"
ENV APP_PORT="8888"

# 对外暴露的端口
EXPOSE $APP_PORT

RUN echo "APP_PORT ${APP_PORT}"

# notice if u want use env arg in entrypoint u should use plainText but array mode
ENTRYPOINT php -S 0.0.0.0:$APP_PORT

注意:ENTRYPOINT / CMD 如果需要引用环境变量,则只能使用 ENTRYPOINT cmd xxx 的方式。

tips: 如果需要登录容器后再启动服务,可以设为启动一个 bash 会话来保证容器不退出

ENTRYPOINT ["bash", "-c", "echo welcome to docker"]

反正入口程序一定要有 会话保持 的特性,否则容器运行完命令后就会自动退出了。

index.php

<?php

var_dump(getenv("APP_NAME"));
var_dump(getenv("APP_VER"));
var_dump(getenv("APP_PORT"));
var_dump($_GET);

打包镜像

# 打包要养成版本号的良好习惯
docker build -t php-demo:v1 .
docker build -t php-demo:v2 .

# 查看本地镜像
docker images

创建/运行容器

# 使用镜像创建容器 传入环境变量
docker run -it \
--privileged=true \
-e APP_NAME="php-demo-1" \
-e APP_VER="1.0.1" \
-e APP_PORT="8889"
-p 8888:8889
--name php-demo-1 php-demo:v1

# 查看容器
docker ps

# 登录容器
docker exec -it php-demo-1 bash

# 读取环境变量
php env.php

文件 cp

# 拷贝宿主机文件到容器
docker cp tmp.php php-demo-1:/apps/demo
# 拷贝容器文件到宿主机
docker cp php-demo-1:/apps/demo/env.php env.php

big_cat
1.7k 声望130 粉丝

规范至上