![](/img/trans.png)
[英]Unable to execute commands inside docker container in Jenkins Execute Shell
[英]How to execute commands inside docker container from Jenkins
我的要求是手动将证书添加到容器中 Java 中的 keytroe。 为此,我使用以下命令。
sudo docker exec -it my-container-name bash
--> 进入容器
cd /java/lib/security
--> chnage目录到java安全路径
keytool -keystore cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias testcert -file /cert/test-Base64.cer
--> 安装证书
上述命令工作正常。 现在,我想从 Jenkins 自动执行此操作。 我的意思是,我希望在 ' sudo docker-compose up -d
' 之后执行这些命令。
任何人都可以请帮忙。
如果您在容器启动后仍想这样做,请使用
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"
您通常应该找到避免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 ["java", ...]
行, 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 \
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.