【问题标题】:Dockerfile - Can't use another name than 'app.py'Dockerfile - 不能使用“app.py”以外的其他名称
【发布时间】:2017-09-04 07:38:41
【问题描述】:

过去几天我一直在搜索有关 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

希望有人可以帮助我:)

【问题讨论】:

    标签: python python-2.7 docker dockerfile


    【解决方案1】:

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

    在这个 Dockerfile 中定义了一个“CMD”,它指定了容器的第一个命令。这里,就是

    CMD python app.py
    

    (见last line of your base image)。

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

    这就是为什么您的 Dockerfile 在容器创建时开始 python app.py

    您需要覆盖 Dockerfile 中的“CMD”部分,例如

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

    请参阅official docker docs 了解 CMD。

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

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

    【讨论】:

    • 酷,感谢您的快速回答。你知道我怎么能同时运行它们吗? :)
    • 我在一个带有supervisor 的项目中实现了这一点,这似乎是最干净的解决方案之一。
    • 或者既然您现在知道第一个 CMD 命令是如何转换为 shell 语法的,您可以使用它来启动多个进程。取决于您希望它如何运行
    • 能否给我一些代码提示? ?
    • 酷,非常感谢您抽出宝贵时间。非常感谢您的回答??
    【解决方案2】:

    如果有人想知道我是如何解决问题的,我使用了 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 容器复制到本地主机。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多