docker - GitLab CI:如何连接到 .gitlab-ci.yml 脚本中启动的 docker 容器?
问题描述
初始任务
在我的 GitLab CI 构建中,我想:
- 使用本地 AmazonDB 启动 docker 容器。标准端口布局:
8000
docker 中的端口,端口8000
暴露。当然,一切都在本地运行,我可以连接(curl
、、、awc-cli
Amazon DB 的 Java 代码,随心所欲)。 - 将它用于测试,即以
--endpoint-url http://localhost:8000
(或任何其他映射的 IP 而不是localhost
)连接到它。
问题
.gitlab-ci.yml
看起来像这样:
image: docker:stable
build/test:
tags:
- gradle
- eu
stage: test
# doesn't work with or without it
# services:
# - docker:dind
script:
# display local running containers
- echo Displaying all running docker containers with "amazon/dynamodb-local" image...
- docker ps --filter ancestor=amazon/dynamodb-local
# stop all running docker containers with "amazon/dynamodb-local" image
- echo Stopping all Docker containers with "amazon/dynamodb-local" image...
- CONTAINERS=$(docker ps -q --filter ancestor=amazon/dynamodb-local)
- >
if [ "${CONTAINERS}" == "" ]; then
echo No docker containers with "amazon/dynamodb-local" image running. Nothing to stop.
else
docker stop $(docker ps -q --filter ancestor=amazon/dynamodb-local)
echo All Docker containers with "amazon/dynamodb-local" image stopped.
fi
# start DynamoDB local as a docker container with shared database
# - java -Djava.library.path=./dynamodb_local_latest/DynamoDBLocal_lib -jar ./dynamodb_local_latest/DynamoDBLocal.jar -sharedDb
# relative path to causes "Error: Unable to access jarfile" for both windows and linux
# run Docker in detached mode to not hang on the opened console
- cd ./dynamodb_local_latest
- docker run --detach -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDb
- cd ./..
# display local running containers
- echo Displaying all running docker containers with "amazon/dynamodb-local" image...
- docker ps --filter ancestor=amazon/dynamodb-local
# see https://stackoverflow.com/questions/45389116/unable-to-access-docker-compose-containers-created-inside-docker
# $DOCKER_HOST is unix:///var/run/docker.sock
# http://localhost:8080 fails
# http://docker:8000 fails
# http://unix:///var/run/docker.sock:8000 fails
- echo docker host is ${DOCKER_HOST}
- cat /etc/hosts
# - curl docker:80 | true
# - curl docker:8000 | true
# - curl http://docker:8000 | true
# - curl http://docker:8000 | true
# - curl ${DOCKER_HOST} | true
# - curl ${DOCKER_HOST}:8000 | true
- curl localhost:8000 | true
- curl http://localhost:8000 | true
# stop all running docker containers with "amazon/dynamodb-local" image
- echo Stopping all Docker containers with "amazon/dynamodb-local" image...
- CONTAINERS=$(docker ps -q --filter ancestor=amazon/dynamodb-local)
- >
if [ "${CONTAINERS}" == "" ]; then
echo No docker containers with "amazon/dynamodb-local" image running. Nothing to stop.
else
docker stop $(docker ps -q --filter ancestor=amazon/dynamodb-local)
echo All Docker containers with "amazon/dynamodb-local" image stopped.
fi
# display local running containers
- echo Displaying all running docker containers with "amazon/dynamodb-local" image...
- docker ps --filter ancestor=amazon/dynamodb-local
关键执行点(Gitlab-CI 日志)如下所示:
Docker 容器运行:
$ docker run --detach -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDb
c823489c22fffa603c1ae1b91d898cb7de4964774d54a08c9fdf0b891c2243b4
$ echo Displaying all running docker containers with "amazon/dynamodb-local" image...
Displaying all running docker containers with amazon/dynamodb-local image...
$ docker ps --filter ancestor=amazon/dynamodb-local
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c823489c22ff amazon/dynamodb-local "java -jar DynamoDBL…" 1 second ago Up Less than a second 0.0.0.0:8000->8000/tcp peaceful_beaver
curl 失败(尝试了所有可能的变化,这只是一个例子):
$ curl localhost:8000 | true
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (7) Failed to connect to localhost port 8000: Connection refused
Authenticating with credentials from $DOCKER_AUTH_CONFIG
ERROR: Job failed: exit code 7
我试过有无
services:
- docker:dind
尝试使用主机名localhost
or docker
,tcp://localhost
带http://
前缀或不带前缀,使用端口80
,8000
or 2375
。没有任何效果。
的${DOCKER_HOST}
值为unix:///var/run/docker.sock
:
$ echo docker host is ${DOCKER_HOST}
docker host is unix:///var/run/docker.sock
/etc/hosts
不包含别名docker
$ cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 runner-H3HL9s9t-project-913-concurrent-0
问题
- 如何解决这个典型的任务?
- 是否可以解决
docker run
,或者需要复杂的docker-compose
使用。 - 是否有工作示例的链接?
- 没有
docker
别名是一个问题/etc/hosts
吗? unix:///var/run/docker.sock
的有效值是${DOCKER_HOST}
? 这个变量的值不应该设置在variables
(.gitlab-ci.yml
尤其是tcp://localhost:2375
)中吗?
链接
我用谷歌搜索了多个链接。那里的解决方案目前对我没有帮助。
- https://gitlab.com/gitlab-com/support-forum/issues/748
- https://gitlab.com/gitlab-org/charts/gitlab/issues/478
- https://blog.lwolf.org/post/how-to-build-and-test-docker-images-in-gitlab-ci/
- https://gitlab.com/gitlab-org/gitlab-foss/issues/26566 - 类似的问题,对于
docker-compose
- https://gitlab.com/gitlab-org/gitlab-foss/issues/40774 - 完全相同的问题
- Gitlab CI runner 无法暴露嵌套 Docker 容器的端口
- 无法访问在 docker 内创建的 docker-compose 容器
解决方案
实际上没有必要用手册docker run
/docker stop
在-script
节内编写如此复杂的解决方案。苗条和简单的方法是使用本地 DynamoDB 作为service
.
使用此脚本,本地 DynamoDB 将可以通过元素的 url 访问alias
,services
即dynamodb-local
对于本示例:
services:
- name: amazon/dynamodb-local
alias: dynamodb-local
aws dynamodb
使用http://dynamodb-local:8000
端点 url执行有效:
script:
- DYNAMODB_LOCAL_URL=http://dynamodb-local:8000
- apk add --no-cache curl jq python py-pip
- pip install awscli
- aws dynamodb list-tables --endpoint-url ${DYNAMODB_LOCAL_URL} --region eu-central-1
推荐阅读
- javascript - My bot is responding to all prefixes and I don't know why
- php - 使用 pdo 上传图片
- sql - 通过输入查询识别
- c - GTK 回调函数如何在 C 中发现它自己的小部件指针?
- laravel - Laravel 渴望加载与基于父级的条件的关系
- android - SerializedName VS Keep Annotation - 哪一个更安全?
- reactjs - 测试 REDUX 连接组件 mapDISpatchToProps
- php - 如何从php中的flutter中解密aes加密
- angular - 为什么在 Angular 9 应用程序的选择中选择第一个值后出现必需的错误?
- shell - jenkins 管道处理来自 shell 脚本的空输出