dockerImage.txt
做一个docker镜像:
dockerFile:
#1,假如没有app目录,在执行WORKDIR /app时
# docker会怎么做?自动报错还是就此止步?
# Docker 会自动创建该目录(包括所有需要的父目录),然后继续执行。
#2,Dockerfile有大小写要求吗?
# 有要求Dockerfile,如果需要使用其他文件名,可以通过 -f 参数指定
# 安装依赖
# 复制项目文件(login_data.csv 不再复制)
#ENTRYPOINT定义容器启动时的主进程后能得到什么,执行了吗?只是指定本身?定义后和普通执行有什么区别?
#ENTRYPOINT会把 启动docker的shell命令 当作参数 [追加>>],
#CMD会把 启动docker的shell命令 当作命令 [覆盖>]。
#RUN 构建镜像时;ENTRYPOINT容器启动时;CMD容器启动时;
#ENTRYPOINT 和 createCookie.sh 用来写 login_data.csv 文件
#ENTRYPOINT 建议写完整路径
FROM docker.1ms.run/python:3-slim
WORKDIR /app
COPY requirements.txt .
COPY templates/ templates/
COPY logging.conf .
COPY app.py .
RUN pip install –no-cache-dir -r requirements.txt
RUN chmod +x app.py
EXPOSE 5000
RUN chmod +x createCookie.sh
RUN chmod +x app.py
CMD [“/app/createCookie.sh”]
ENTRYPOINT [“python3”, “app.py”]
项目文件:
app.py
templates\download.html
login_data.csv
logging.conf
requirements.txt
env:
cookie=””
redis_ip=””
redis_password=””
envFile:
用createCookie.sh通过环境变量.env去创建login_data.csv文件
Python3:基础镜像自带
docker-compose.yml:
version: ‘3.8’
services:
app:
build: .
container_name: ebilibili
ports:
– “5000:5000” # 宿主机5000映射到容器5000
env_file:
– .env
# 可选:添加健康检查
healthcheck:
test: [“CMD”, “curl”, “-f”, “http://localhost:5000”]
interval: 30s
timeout: 10s
retries: 3
其他经验:
docker build -t ebilibili .
Docker 构建失败时没有造成任何残留影响。
#绕过 pip 的复杂特性
RUN pip install –no-cache-dir \
–disable-pip-version-check \
–no-color \
–no-input \
–progress-bar off \
–retries 1 \
–timeout 10 \
-r requirements.txt \
-i https://pypi.tuna.tsinghua.edu.cn/simple
/etc/security/limits.conf
ulimit -u # 最大用户进程数
ulimit -n # 最大文件打开数
ulimit -s # 栈大小
不要同时用 CMD 和 ENTRYPOINT 来执行不同的命令!
CMD /app/createCookie.sh
ENTRYPOINT [“python3”, “app.py”]
这样会导致:python3 app.py /app/createCookie.sh
CMD的两个写法:
# -c 执行后面的命令字符串
CMD [“/bin/bash”, “-c”, “/app/createCookie.sh && python3 app.py”]
CMD /app/createCookie.sh && python3 app.py
环境变量两个写法:
–env-file .env
-e cookie=”你的cookie值” \
-e USERNAME=”yourname” \
-e DEBUG=”false” \
podman run -d -p 5000:5000 –name ebilibili –env-file .env ebilibili
cat /proc/net/tcp
遇到的历史bug,折腾了好久,最后更换镜像python:3-alpine。
python:3.12.8-slim:当 Python 3.14 的父进程在 fork() 一个子进程时,如果父进程中存在一个被创建但还未启动 (start()) 的 Thread 对象,这个对象的状态信息在 fork 后的子进程中会丢失。
docker run -d –name shop-ebilibili -p 5000:5000 –env-file .env ebilibili
有想法,记录下来,做起来,踩坑,修正,记录,迭代。
上面那些有些陈旧了
[root@shop flaskDocker]# cat Dockerfile
#FROM docker.1ms.run/python:3.12.8-slim
FROM docker.1ms.run/python:3-alpine
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
PIP_NO_CACHE_DIR=1 \
PIP_DISABLE_PIP_VERSION_CHECK=1
COPY requirements.txt .
COPY templates/ templates/
COPY logging.conf .
COPY app.py .
COPY createCookie.sh .
#COPY .env .
#RUN pip install –upgrade pip==24.0
#RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install –no-cache-dir \
–disable-pip-version-check \
–no-color \
–no-input \
–progress-bar off \
–retries 1 \
–timeout 10 \
-r requirements.txt \
-i https://pypi.tuna.tsinghua.edu.cn/simple
RUN chmod +x app.py
EXPOSE 5000
RUN chmod +x /app/createCookie.sh
RUN chmod +x app.py
#CMD [“/bin/sh”, “-c”, “/app/createCookie.sh && python3 app.py”]
CMD /app/createCookie.sh && python3 app.py
[root@shop flaskDocker]# cat createCookie.sh
#!/bin/sh
echo ${cookie} > /app/login_data.csv
sed -i ‘s/^.//;s/.$//’ /app/login_data.csv
做集群还有个很致命的问题,炎火云是多个人共享IP,80和443在外部是禁用的,也就是说,这是不可能直接通过简单调整ebilibili.com直接跳转的。
可以把www.ebilibili.com这台服务器做一次远程转发,但是也太慢了,这反而是负优化,但是我还没有做。只是猜测“太慢”了。可能并不慢,或许根本没那么大的影响,我应该先做起来。
但似乎没办法,我没那么多服务器,这种方法一般是内网服务器之间做的。
等一个月后服务器过期了怎么办?去哪搞一台新的?好像香草云还有点余额可以开一个月?那我应该现在用来做毕设还是延长ebilibili整体寿命?
我可以直接给www的5000做一次负载均衡转发,带着url上的BV号去其他服务器上。
然后还要同步日志,用远程的redis集群,虽然根本用不上集群,但是还是要做一次,只是为了做而做,就像我网站的流量完全用不上容器完全用不上负载均衡一样。我很清楚这一点,但将来我要找工作就需要练习,而碰巧有这么个毕设环境可以练。
评论(2)