Python 来自包含VirtualEnv的容器的提交映像不工作

Python 来自包含VirtualEnv的容器的提交映像不工作,python,docker,virtualenv,Python,Docker,Virtualenv,使用虚拟环境创建安装有气流的自定义基础映像。图像运行良好。但承诺的形象是行不通的 我在网上试过,但找不到解决办法 1) 提交了一个映像,该映像是通过以下步骤创建的,并在localhost:8080中成功运行 virtualenv launch-airflow source launch-airflow/bin/activate 安装apache airflow mkdir ~/airflow export AIRFLOW_HOME=~/airflow pip3 install apache-a

使用虚拟环境创建安装有气流的自定义基础映像。图像运行良好。但承诺的形象是行不通的

我在网上试过,但找不到解决办法

1) 提交了一个映像,该映像是通过以下步骤创建的,并在localhost:8080中成功运行

virtualenv launch-airflow
source launch-airflow/bin/activate
安装apache airflow

mkdir ~/airflow
export AIRFLOW_HOME=~/airflow
pip3 install apache-airflow[all]==1.10.4 --no-deps 

pip3 install apache-airflow[contrib]==1.10.4
pip3 install apache-airflow[postgres]==1.10.4
pip3 install apache-airflow[celery]==1.10.4
airflow initdb
2) 推到Docker中心

3) 从码头工人那里拉过来的

4) 使用以下命令运行以启动


docker run-d-p 8080:8080 myimage:version

docker commit
是一个相当有限的命令。它会导致生成不可复制的版本,并且不能指定图像元数据的关键部分,如要运行的默认命令。我强烈建议永远不要运行它

不过,您显示的步骤大约是工作Dockerfile的95%。让我们把它建立起来,也指的是沿途发生的事情。这是一个基于Python的应用程序,因此我们可以从

在Docker中,通常不使用Python虚拟环境,因为Docker映像本身是一种隔离形式。这意味着您只需将包安装到“系统”Python包空间(隔离在容器内)

这里的下一步是“初始化数据库”。不过,这很棘手,因为在Docker中,通常在单独的容器中运行数据库。这里的一个标准技巧是编写一个shell脚本进行首次初始化,然后运行主容器进程

#/垃圾箱/垃圾箱
气流初始数据库
执行官“$@”
Docker启动有两个部分,一个入口点和一个命令。如果您同时指定了这两个参数,那么entrypoint将使用作为参数传递的命令运行。在上面的脚本中,
exec“$@”
用命令行参数指定的任何参数替换脚本。因此,我们需要将该脚本复制到图像中,将其设置为入口点,并将主气流服务器设置为主命令

COPY docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 8080
CMD ["airflow", "webserver"]
现在您可以构建并运行这个

docker build -t myname/airflow:1.10.4 .
docker run --name airflow-server -p 8080:8080 myname/airflow:1.10.4
快速启动还建议运行调度程序。您可以通过在
docker run
命令末尾添加额外参数来替换
CMD
,例如

docker run --name airflow-scheduler myname/airflow:1.10.4 airflow scheduler
(作为练习,PyPI告诉我现在有1.10.5版本。你能更新你提交的图像以获得更新版本的Airflow吗?你能更新Dockerfile吗?)

docker build -t myname/airflow:1.10.4 .
docker run --name airflow-server -p 8080:8080 myname/airflow:1.10.4
docker run --name airflow-scheduler myname/airflow:1.10.4 airflow scheduler