修改Docker容器的ENTRYPOINT以在CMD之前运行脚本

时间:2017-05-25 02:52:27

标签: docker

我想在每次在Docker中创建容器时运行脚本来附加网络驱动器。根据我的阅读,这应该可以通过设置自定义入口点来实现。这就是我到目前为止所拥有的:

FROM ubuntu
COPY *.py /opt/package/my_code
RUN mkdir /efs && \
    apt-get install nfs-common -y && \
    echo "#!/bin/sh" > /root/startup.sh && \
    echo "mount -t nfs4 -o net.nfs.com:/ /nfs" >> /root/startup.sh && \
    echo "/bin/sh -c '$1'" >> /root/startup.sh && \
    chmod +x /root/startup.sh
WORKDIR /opt/package
ENV PYTHONPATH /opt/package
ENTRYPOINT ["/root/startup.sh"]

目前我的CMD未正确传递到我/ bin / sh系列,但我想知道是否有更简单的方法来实现这一目标?

不幸的是,我无法控制如何创建容器。这意味着我不能简单地将网络安装命令添加到原始docker命令。

1 个答案:

答案 0 :(得分:0)

来自documentation

  

CMD应该用作为ENTRYPOINT命令定义默认参数或在容器中执行临时命令的方式

因此,如果您指定了ENTRYPOINT,则CMD将作为附加参数传递给它。这意味着您的入口点脚本应显式处理这些参数。

就您而言,当您运行时:

docker run yourimage yourcommand

您的容器中执行的是:

/root/startup.sh yourcommand

解决方案是在exec "$@"脚本的末尾添加/root/startup.sh。这样,它将执行作为其参数给出的任何命令。

您可能想阅读about the ENTRYPOINT mechanisms and its interaction with CMD