gpt4 book ai didi

docker - GitLab CI : how to connect to the docker container started in . gitlab-ci.yml 脚本?

转载 作者:行者123 更新时间:2023-12-02 19:20:24 28 4
gpt4 key购买 nike

初始任务

在我的 GitLab CI 构建中,我想:

  • 使用本地 AmazonDB 启动一个 docker 容器。标准端口布局:docker 中的端口 8000,暴露的端口 8000。当然,一切都在本地运行,我可以连接(curlawc-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

尝试使用主机名 localhostdockertcp://localhost,使用 http://前缀或不带前缀,使用端口 8080002375。什么都没用。

${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
  • 是否有工作示例的链接?
  • /etc/hosts 中没有 docker 别名是不是有问题?
  • unix:///var/run/docker.sock${DOCKER_HOST} 的有效值吗?不应该在 .gitlab-ci.ymlvariables 中设置此变量的值(特别是 tcp://localhost:2375 )?

链接

我用谷歌搜索了多个链接。目前,那里的解决方案对我没有帮助。

最佳答案

实际上没有必要在 -script 部分中使用手动 docker run/docker stop 编写如此复杂的解决方案。最简单的方法是使用本地 DynamoDB 作为 service

使用此脚本,可以通过 services 元素的 alias 的 url 访问本地 DynamoDB,即本例中的 dynamodb-local:

  services:
- name: amazon/dynamodb-local
alias: dynamodb-local

使用 http://dynamodb-local:8000 endpoint url works 执行 aws dynamodb:

  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

此选项在 this 中找到很好的答案。非常感谢 @madhead感谢提供!

关于docker - GitLab CI : how to connect to the docker container started in . gitlab-ci.yml 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60326823/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com