Dockerfile:是否可以引用重写的入口点和cmd?

时间:2017-04-06 22:08:41

标签: docker dockerfile

我尝试使用来自here的mysql 5.6构建图像作为基本图像。我需要在数据库启动之前进行一些初始化,所以我需要覆盖入口点:

# Stuff in my Dockerfile
...
COPY my-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["my-entrypoint.sh"]

我的入口点也很简单:

#!/bin/bash
echo "Running my-entrypoint.sh"
# My initialization stuff here
...
# Call mysql entrypoint
/usr/local/bin/docker-entrypoint.sh mysqld

这似乎有效,但我不必在我的脚本(或我的Dockerfile)中对mysql入口点进行硬编码。有没有办法在我的Dockerfile中引用重写的入口点,以便它可用于我的入口点脚本?也许是这样的事情?

COPY my-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["my-entrypoint.sh", BASE_ENTRYPOINT, BASE_CMD]

2 个答案:

答案 0 :(得分:0)

它必须以某种方式出现在某个地方,否则你无法得到这样的信息。

  • 选项1:对ENV中的先前入口点使用Dockerfile,然后在您自己的entrypoint.sh中引用它:

    Dockerfile:

    FROM alpine:3.3
    
    ENV MYSQL_ENTRYPOINT "/usr/bin/mysql mysqld"
    ADD entrypoint.sh /
    ENTRYPOINT ["/entrypoint.sh"]
    

    Entrypoint.sh:

    #!/bin/sh
    
    echo $MYSQL_ENTRYPOINT
    
  • 选项2:只需将上一个入口点命令作为参数传递给入口点:

    Dockerfile:

    FROM alpine:3.3
    
    ADD entrypoint.sh /
    ENTRYPOINT ["/entrypoint.sh"]
    CMD ["/usr/bin/mysql mysqld"]
    

    Entrypoint.sh:

    #!/bin/sh
    
    echo $1
    

我个人更喜欢选项#1。

答案 1 :(得分:0)

2种方式:

在您指定图片后立即传入,之后的所有内容都会成为CMD并附加到您的ENTRYPOINT。所以......

# Stuff in my Dockerfile
...
COPY my-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["my-entrypoint.sh"]

然后docker run ... image <your-entrypoint-etc>然后让你的自定义入口点获取第一个arg并使用它然后你需要。

第二种方法,只需在运行时将其作为环境变量传递。

docker run ... -e MYSQL_ENTRYPOINT=<something> ...

在您的入口点脚本中,请参阅env变量... $MYSQL_ENTRYPOINT ...