[英]GitLab CI: how to connect to the docker container started in .gitlab-ci.yml script?
In my GitLab CI build, I want to:在我的 GitLab CI 构建中,我想:
8000
in docker, port 8000
exposed.8000
端口, 8000
端口暴露。 Of course, everything works locally, I can connect ( curl
, awc-cli
, Java code for Amazon DB, whatever you wish).curl
、 awc-cli
、Amazon DB 的 Java 代码,无论您想要什么)。--endpoint-url http://localhost:8000
(or any other mapped IP instead of localhost
).--endpoint-url http://localhost:8000
(或任何其他映射 IP 而不是localhost
)的形式连接到它。.gitlab-ci.yml
looks like this: .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
Critical execution points (Gitlab-CI log) look like this:关键执行点(Gitlab-CI 日志)如下所示:
Docker container runs: 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 fails (tried all possible variations, this is just an example): 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
I tried with and without我试过有没有
services:
- docker:dind
Tried with host names localhost
or docker
or tcp://localhost
, with http://
prefix or without it, with ports 80
, 8000
or 2375
.尝试使用主机名
localhost
或docker
或tcp://localhost
,带http://
前缀或不带前缀,端口为80
、 8000
或2375
。 Nothing works.什么都行不通。
Value of ${DOCKER_HOST}
is unix:///var/run/docker.sock
: ${DOCKER_HOST}
是unix:///var/run/docker.sock
:
$ echo docker host is ${DOCKER_HOST}
docker host is unix:///var/run/docker.sock
/etc/hosts
does not contain an alias for docker
/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
, or complex docker-compose
usage required.docker run
,或者需要复杂的docker-compose
使用。docker
alias in /etc/hosts
?/etc/hosts
没有docker
别名吗?unix:///var/run/docker.sock
a valid value of ${DOCKER_HOST}
? unix:///var/run/docker.sock
是${DOCKER_HOST}
的有效值吗? Shouldn't the value for this variable be set in variables
of .gitlab-ci.yml
(particularly to tcp://localhost:2375
)?variables
的.gitlab-ci.yml
(特别是tcp://localhost:2375
)?There are multiple links that I've googled.我在谷歌上搜索了多个链接。 Solutions from there haven't helped me for now.
那里的解决方案暂时没有帮助我。
docker-compose
docker-compose
There is actually no need in writing such a complex solution with manual docker run
/ docker stop
inside the -script
section.实际上没有必要在
-script
部分中使用手动docker run
/ docker stop
编写如此复杂的解决方案。 The slim and simple way is to use the local DynamoDB as service
.苗条和简单的方法是使用本地 DynamoDB 作为
service
。
With this script, local DynamoDB will be accessible via url from alias
of the services
element, ie dynamodb-local
for this example:使用此脚本,本地 DynamoDB 将可以通过来自
services
元素alias
的 url 访问,即本示例中的dynamodb-local
:
services:
- name: amazon/dynamodb-local
alias: dynamodb-local
Executing aws dynamodb
with http://dynamodb-local:8000
endpoint url works:使用
http://dynamodb-local:8000
端点 url 执行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 option was found in this great answer.这个选项是在这个很好的答案中找到的。 Many thanks to @madhead for providing it!
非常感谢@madhead提供它!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.