CMD does not run if used after ENTRYPOINT.

huangapple go评论140阅读模式
英文:

CMD does not run if used after ENTRYPOINT

问题

我有以下的Docker文件

  1. FROM confluentinc/cp-kafka-connect:5.3.1
  2. RUN apt-get update && apt-get -y install cron
  3. ENV CONNECT_PLUGIN_PATH=/usr/share/java
  4. # JDBC-MariaDB
  5. RUN wget -nv -P /usr/share/java/kafka-connect-jdbc/ https://downloads.mariadb.com/Connectors/java/connector-java-2.4.4/mariadb-java-client-2.4.4.jar
  6. # SNMP Source
  7. RUN wget -nv -P /tmp/ https://github.com/name/kafka-connect-snmp/releases/download/0.0.1.11/kafka-connect-snmp-0.0.1.11.tar.gz
  8. RUN mkdir /tmp/kafka-connect-snmp && tar -xf /tmp/kafka-connect-snmp-0.0.1.11.tar.gz -C /tmp/kafka-connect-snmp/
  9. RUN mv /tmp/kafka-connect-snmp/usr/share/kafka-connect/kafka-connect-snmp /usr/share/java/
  10. COPY plugins-config.sh /usr/share/kafka-connect-script/plugins-config.sh
  11. RUN chmod +x /usr/share/kafka-connect-script/plugins-config.sh
  12. ENTRYPOINT [ "./etc/confluent/docker/run" ]
  13. CMD ["/usr/share/kafka-connect-script/plugins-config.sh"]

以及这个bash文件

  1. #!/bin/bash
  2. #用于配置带有插件的kafka连接的脚本
  3. # export CONNECT_REST_ADVERTISED_HOST_NAME=localhost
  4. # export CONNECT_REST_PORT=8083
  5. url=http://$CONNECT_REST_ADVERTISED_HOST_NAME:$CONNECT_REST_PORT/connectors
  6. curl_command="curl -s -o /dev/null -w %{http_code} $url"
  7. sleep_second=5
  8. sleep_second_counter=0
  9. max_seconds_to_wait=60
  10. echo "等待Kafka Connect开始在本地监听" >> log.log
  11. echo "主机: $CONNECT_REST_ADVERTISED_HOST_NAME , 端口: $CONNECT_REST_PORT" >> log.log
  12. while [[ $(eval $curl_command) -eq 000 && $sleep_second_counter -lt $max_seconds_to_wait ]]
  13. do
  14. echo "中" >> log.log
  15. echo -e $date " Kafka Connect监听HTTP状态: " $(eval $curl_command) " (等待200) $sleep_second_counter" >> log.log
  16. echo "将休眠 $sleep_second 秒" >> log.log
  17. sleep $sleep_second
  18. echo "休眠完成" >> log.log
  19. ((sleep_second_counter+=$sleep_second))
  20. echo "完成计数" >> log.log
  21. done
  22. echo "结束" >> log.log
  23. nc -vz $CONNECT_REST_ADVERTISED_HOST_NAME $CONNECT_REST_PORT
  24. /bin/bash

入口点被正确调用,但CMD没有被调用。

我也尝试理解这里提供的解决方案 https://stackoverflow.com/questions/54447913/cmd-doesnt-run-after-entrypoint-in-dockerfile

但我没有理解解决方案。

如果有人能够更详细地解释这里有什么问题,那将会很有帮助。

我试图完成的目标

我试图创建一个单一的Docker容器映像,该映像将启动kafka-connect服务器(ENTRYPOINT),然后通过bash文件(CMD)配置插件。要求每次容器重新启动时都执行相同的步骤。

英文:

I have the following docker file

  1. FROM confluentinc/cp-kafka-connect:5.3.1
  2. RUN apt-get update && apt-get -y install cron
  3. ENV CONNECT_PLUGIN_PATH=/usr/share/java
  4. # JDBC-MariaDB
  5. RUN wget -nv -P /usr/share/java/kafka-connect-jdbc/ https://downloads.mariadb.com/Connectors/java/connector-java-2.4.4/mariadb-java-client-2.4.4.jar
  6. # SNMP Source
  7. RUN wget -nv -P /tmp/ https://github.com/name/kafka-connect-snmp/releases/download/0.0.1.11/kafka-connect-snmp-0.0.1.11.tar.gz
  8. RUN mkdir /tmp/kafka-connect-snmp && tar -xf /tmp/kafka-connect-snmp-0.0.1.11.tar.gz -C /tmp/kafka-connect-snmp/
  9. RUN mv /tmp/kafka-connect-snmp/usr/share/kafka-connect/kafka-connect-snmp /usr/share/java/
  10. COPY plugins-config.sh /usr/share/kafka-connect-script/plugins-config.sh
  11. RUN chmod +x /usr/share/kafka-connect-script/plugins-config.sh
  12. ENTRYPOINT [ "./etc/confluent/docker/run" ]
  13. CMD ["/usr/share/kafka-connect-script/plugins-config.sh"]

And the bash file as this

  1. #!/bin/bash
  2. #script to configure kafka connect with plugins
  3. # export CONNECT_REST_ADVERTISED_HOST_NAME=localhost
  4. # export CONNECT_REST_PORT=8083
  5. url=http://$CONNECT_REST_ADVERTISED_HOST_NAME:$CONNECT_REST_PORT/connectors
  6. curl_command="curl -s -o /dev/null -w %{http_code} $url"
  7. sleep_second=5
  8. sleep_second_counter=0
  9. max_seconds_to_wait=60
  10. echo "Waiting for Kafka Connect to start listening on localhost" >> log.log
  11. echo "HOST: $CONNECT_REST_ADVERTISED_HOST_NAME , PORT: $CONNECT_REST_PORT" >> log.log
  12. while [[ $(eval $curl_command) -eq 000 && $sleep_second_counter -lt $max_seconds_to_wait ]]
  13. do
  14. echo "In" >> log.log
  15. echo -e $date " Kafka Connect listener HTTP state: " $(eval $curl_command) " (waiting for 200) $sleep_second_counter" >> log.log
  16. echo "Going to sleep for $sleep_second seconds" >> log.log
  17. sleep $sleep_second
  18. echo "Finished sleeping" >> log.log
  19. ((sleep_second_counter+=$sleep_second))
  20. echo "Finished counter" >> log.log
  21. done
  22. echo "Out" >> log.log
  23. nc -vz $CONNECT_REST_ADVERTISED_HOST_NAME $CONNECT_REST_PORT
  24. /bin/bash

Entry point gets called correctly but CMD does not get invoked.

I also try to understand the solution given here https://stackoverflow.com/questions/54447913/cmd-doesnt-run-after-entrypoint-in-dockerfile

but I did not understand the solution.

If someone could explain a bit more what is wrong here.

What I am trying to accomplish

I am trying to have a single docker container image which will start the kafka-connect server (ENTRYPOINT) and then via bash file (CMD) I will configure the plugins. Requirement is that the same sequence of steps gets executed everytime the containers restarts.

答案1

得分: 1

CMDENTRYPOINT 之后运行,就像函数调用后的参数一样,在同一条命令行上。

在你的情况下,你想要按顺序运行两个不同的命令。那么,你可以将它们添加到一个名为 startup_script.sh 的文件中,其内容如下:

  1. #!/bin/bash
  2. ./etc/confluent/docker/run & # 后台运行,以免在此处卡住
  3. /usr/share/kafka-connect-script/plugins-config.sh # 应用配置
  4. sleep 100000000 # 为了避免启动脚本退出,因为那会导致容器被终止
英文:

CMD is run after ENTRYPOINT, like parameters after a function invokation, in the same command line.

In your case you want two different commands running sequentially. Then, you may add them to a startup_script.sh whose content is:

  1. #!/bin/bash
  2. ./etc/confluent/docker/run & # run in background not to get stuck in here
  3. /usr/share/kafka-connect-script/plugins-config.sh # apply configuration
  4. sleep 100000000 # to avoid the startup script to exit since that would kill the container

huangapple
  • 本文由 发表于 2020年1月3日 18:56:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/59577310.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定