Dockerfile - 不能使用“app.py”之外的其他名称

时间:2017-09-04 07:38:42

标签: python python-2.7 docker dockerfile

过去几天我一直在搜索Dockerfile。我在python 2.7中使用cx_Oracle。这是我的Dockerfile的样子:

FROM sbanal/python-oracle-xe12.1-latest

WORKDIR /code/app
COPY generate_distance.py /code/app/app.py
COPY generate_values.py /code/app/app2.py

为了便于解释,我制作了一种方法来打印出文件的名称。在generate_distance.py中:

def test():
    print "Generate distance"

test()

在generate_values.py中:

def test():
    print "Generate values"

test()

然后我用标签运行docker build:

docker build -t gen .      
Sending build context to Docker daemon  13.82kB
Step 1/4 : FROM sbanal/python-oracle-xe12.1-latest
 ---> 723335924016
Step 2/4 : WORKDIR /code/app
 ---> Using cache
 ---> 9fde6fb3ac02
Step 3/4 : COPY generate_distance.py /code/app/app.py
 ---> 1dbf7ef85ee3
Removing intermediate container ae626dcef48c
Step 4/4 : COPY generate_values.py /code/app/app2.py
 ---> 7a54500b88a3
Removing intermediate container f496edfc237d
Successfully built 7a54500b88a3
Successfully tagged gen:latest

运行'docker images'时,我可以看到'gen'图像。但是当我运行'gen'图像时,只有app.py正在运行:

>docker run -p 5500:5000 gen
>Generate distance

我看不出我做了什么错。我也不知道为什么它必须被称为app.py.如果我在Dockerfile中的COPY期间使用不同的文件名,我会收到“没有这样的文件或目录”错误。那就是:

FROM sbanal/python-oracle-xe12.1-latest

WORKDIR /code/app
COPY generate_relation_distance.py /code/app/generate_relation_distance.py
COPY generate_ten_values.py /code/app/generate_ten_values.py

像部件一样构建和运行:

docker run -p 5500:5000 gen
python: can't open file 'app.py': [Errno 2] No such file or directory

希望有人可以帮助我:)。

2 个答案:

答案 0 :(得分:3)

您的图片基于sbanal/python-oracle-xe12.1-latest(Dockerfile的第一行)。

在这个Dockerfile中是一个" CMD" defined,指定容器的第一个命令。这是

CMD python app.py

(见last line of your base image)。

该命令将以sh -c "python app.py"执行。

这就是您的Dockerfile在容器创建python app.py

上启动的原因

您需要覆盖" CMD"部分在你的Dockerfile中,例如

CMD ["python", "app2.py"]

请参阅official docker docs了解CMD。

您的Dockerfile中只有一个CMD包含第一个命令,该命令由容器自动执行。

如果您想要启动多项服务,您应该考虑,如果这应该真正打包到一个图像中。或者您遵循official docs并考虑使用主管或脚本来启动您所需的服务。

答案 1 :(得分:0)

如果有人想知道我是如何解决问题的,那么我使用的是bash脚本。

script.sh:

#Build the image
docker build -t image_name .

#Run image image_name in container
docker run -d -p 550:500 image_name tail -f /dev/null

#Get the container id
container_id="$(docker ps | grep $IMAGE_NAME | grep -Eo '^[^ ]+')"

#Run your program in container
docker exec -it container_id /bin/sh -c "python generate_distance.py"
docker exec -it container_id /bin/sh -c "python generate_values.py"

我的目标是将输出存储在文本文件中,并将其从docker容器复制到localhost。