【问题标题】:How to execute commands inside docker container from Jenkins如何在 Jenkins 的 docker 容器中执行命令
【发布时间】:2019-07-01 11:40:52
【问题描述】:

我的要求是手动将证书添加到容器中的 Java 中的 keytroe。为此,我使用以下命令。

sudo docker exec -it my-container-name bash --> 进入容器

cd /java/lib/security --> 将目录更改为 java 安全路径

keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias testcert -file /cert/test-Base64.cer --> 安装证书

以上命令运行良好。现在,我想从詹金斯自动化这个。我的意思是,我希望这些命令在之后执行 'sudo docker-compose up -d' .

谁能帮忙。

【问题讨论】:

  • 在构建阶段不能添加证书有什么原因吗?只需使用 3 个命令添加 RUN 就更容易了。如果证书是动态的,那么编写脚本可能会更好,以便在您需要证书时容器正在运行时执行
  • 谢谢@sleepyhead,我只是按照您建议的方式进行操作,在 docker 文件中使用 RUN 并执行两个我需要的命令。它对我有用。

标签: linux shell docker jenkins docker-compose


【解决方案1】:

如果容器启动后还想这样做,请使用

sudo docker exec -it my-container-name bash -c "cd /java/lib/security; keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias testcert -file /cert/test-Base64.cer"

【讨论】:

    【解决方案2】:

    您通常应该找到避免docker exec 的方法,尤其是对于像这样的脚本使用。 (可以想象,自动化任务会删除和重新创建容器,而无需您手动设置步骤。在 Docker Swarm 或 Kubernetes 等集群环境中更是如此。)

    如果您有一些现有的密钥库文件只想注入到容器中,最简单的方法是在启动时使用docker run -v 选项将其推入。您已经需要一个完全填充的密钥库文件。

    docker run \
      -v $PWD/keystore.jks:/usr/lib/java/jre/lib/security/keystore.jks \
      ...
    

    如果您无法在启动时注入完全填充的密钥库文件,您可以编写一个在容器启动时运行的脚本。它查找某个知名目录,对那里的每个文件运行keytool 命令,然后运行它作为命令行参数传递的命令。

    #!/bin/sh
    if [ -d /cert ]; then
      for f in /cert/*.cer; do
        keytool ... -file "$f"
      done
    fi
    exec "$@"
    

    在您的 Dockerfile 中,复制此脚本并将其设为 ENTRYPOINT。如果您之前有 ENTRYPOINT ["java", ...] 行,请将其更改为 CMD。这看起来像

    FROM java:8
    ...
    COPY entrypoint.sh /app
    ENTRYPOINT ["/app/entrypoint.sh"]
    CMD ["java", "-jar", "/app/myapp.jar"]
    

    然后当你运行容器时,注入/cert目录

    docker run \
      -v $PWD/cert:/cert \
      ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2019-07-06
      • 2021-06-23
      相关资源
      最近更新 更多