在我们的 jenkins2 管道中,我们使用 docker-compose 进行一些测试,我们的 docker-compose 文件从分支名称 (git) 及其内部版本号的组合中获取其网络名称。
詹金斯文件片段:
def version = "$BRANCH_NAME-$BUILD_NUMBER"
def networkName = "network-$version"
sh "NETWORK_NAME=$networkName docker-compose up -d"
Run Code Online (Sandbox Code Playgroud)
docker-compose.yml 片段:
version: '3.5'
networks:
default:
name: ${NETWORK_NAME}
driver: bridge
Run Code Online (Sandbox Code Playgroud)
看起来当我们有一个短的分支名称时一切正常,而当我们有一个长的分支名称时它会失败。
docker-compose 中的网络名称可以保留多长时间?我似乎无法在文档中找到它。是否有比获取分支名称更好的解决方案来获得唯一的网络名称?
我试过这个,但不知何故似乎完全矫枉过正:
echo $(git rev-parse --abbrev-ref HEAD) | md5 | cut -f1 -d" "
Run Code Online (Sandbox Code Playgroud)
将给出 md5 结果。
我正在尝试在一个 docker-compose 中运行两个 MongoDB。由于我想在每个数据库中存储不同的数据,我需要通过不同的端口来区分它们。如果我运行以下 docker-compose,端口 27017 一切正常,但我无法访问端口 27018。在控制台中,两个服务的一切看起来都一样,只有端口 27018 上的服务缺少以下日志:
NETWORK [initandlisten] 等待端口 27017 上的连接(显示端口 27017)
当我尝试在浏览器中访问这两项服务时,端口 27017 上的一项有效,而 27018 上的一项无效。
如果有人能帮助我解决这个问题,我很高兴。很长一段时间以来一直在努力。谢谢!
这是我的代码:
version: "3"
services:
mongo:
image: mvertes/alpine-mongo:4.0.1-0
volumes:
- mongoDBvolume:/data/db
ports:
- "27017:27017"
testmongo:
image: mvertes/alpine-mongo:4.0.1-0
command: mongod --port 27018
volumes:
- mongoDBvolume:/data/testdb
ports:
- "27018:27017"
volumes:
mongoDBvolume:
driver: local
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Docker Compose 容器化与我的 Web 应用程序相关的所有内容,包括 Nginx 和 SSL 证书。为此,我使用了来自 JWilder和LetsEncrypt Companion的Nginx 代理映像,但无法让 nginx 代理正常工作,结果最终是:
Nginx 502 错误网关
[错误] 31160#0:*35 connect() 失败(111:连接被拒绝),同时连接到上游,客户端:xx.xx.xx.xx,服务器:domain.com,请求:“GET /dev/HTTP/1.1 ", 上游: "webapp://127.0.0.1:8080", 主机: "domain.com"
这仅在尝试设置 Nginx 代理和 SSL 证书时发生,所以我知道这是这些容器中的一个或两个的配置问题。如果有人能发现我哪里出错了,我将不胜感激!
以下是有问题的容器:
version: '3.1'
networks:
mywebapp:
services:
nginx-proxy:
container_name: nginx-proxy
build: ./env/nginx-proxy
networks:
- mywebapp
ports:
- 80:80
- 443:443
env_file:
- ./env/nginx-proxy/.env
depends_on:
- webapp
tty: true
volumes:
- ./src:/home/www/mywebapp/src
- ./storage:/home/www/storage/mywebapp
- ./data/nginx-proxy/logs:/var/log/nginx
- ./env/nginx-proxy/webserver/nginx.conf:/etc/nginx/nginx.conf
- ./env/nginx-proxy/webserver/conf.d:/etc/nginx/conf.d
- ./env/nginx-proxy/webserver/vhost.d:/etc/nginx/vhost.d
- …Run Code Online (Sandbox Code Playgroud) reverse-proxy nginx docker docker-compose jwilder-nginx-proxy
我在访问从 docker-compose 文件创建的数据库时遇到问题。
鉴于以下撰写文件,我应该能够使用以下内容从 java 连接到它:
jdbc:postgresql://eprase:eprase@database:7000/eprase
Run Code Online (Sandbox Code Playgroud)
但是,连接被拒绝。我什至不能使用 PGAdmin 使用相同的细节来连接它来创建新服务器。
我已经进入数据库容器并运行 psql 命令来验证是否已根据 postgres Docker 文档创建了 eprase 用户和数据库,一切似乎都很好。我不知道问题是在数据库容器内还是我需要在撰写网络中更改的内容。
客户端和服务器服务在很大程度上可以忽略,服务器是基于 Java 的 Web API,客户端是 Angular 应用程序。
编写文件:
version: "3"
services:
client:
image: eprase/client:latest
build: ./client/eprase-app
networks:
api:
ports:
- "5000:80"
tty: true
depends_on:
- server
server:
image: eprase/server:latest
build: ./server
networks:
api:
ports:
- "6000:8080"
depends_on:
- database
database:
image: postgres:9
volumes:
- "./database/data:/var/lib/postgresql/data"
environment:
- "POSTGRES_USER=eprase"
- "POSTGRES_PASSWORD=eprase"
- "POSTGRES_DB=eprase"
networks:
api:
ports:
- "7000:5432"
restart: unless-stopped
pgadmin:
image: dpage/pgadmin4:latest …Run Code Online (Sandbox Code Playgroud) 我正在尝试将使用 django-rest-framework 制作的 API 放入 docker 容器中。
除了我无法访问我的静态文件之外,一切似乎都有效。
这是我的settings.py:
MEDIA_URL = '/uploads/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
Run Code Online (Sandbox Code Playgroud)
我的网址.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
path('api/bookmakers/', include('bookmakers.urls')),
path('api/pronostics/', include('pronostics.urls')),
path('api/', include('authentication.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Run Code Online (Sandbox Code Playgroud)
我的Dockerfile
FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
&& localedef -i fr_FR -c -f …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Docker 中运行 Nuxt.js 应用程序。我已经像这样设置了我的 Dockerfile:
FROM node:10.15.1 as base
WORKDIR /usr/src/app
COPY package.json ./
ENV HOST 0.0.0.0
FROM base as development
RUN npm install
COPY . .
ENV NODE_ENV development
EXPOSE 3000
CMD [ "npm", "run", "dev" ]
Run Code Online (Sandbox Code Playgroud)
还有我的 docker-compose.yml:
version: "3.7"
services:
frontend:
container_name: frontend
restart: unless-stopped
build:
context: .
target: development
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
ports:
- "3000:3000"
Run Code Online (Sandbox Code Playgroud)
当我跑步时,docker-compose up我得到
frontend | These dependencies were not found: friendly-errors 10:52:33
frontend | friendly-errors 10:52:33
frontend …Run Code Online (Sandbox Code Playgroud) 我希望能够在无法连接到 rabbitmq 时重新启动 golang docker 文件,如下所述:(Docker Compose 在启动 Y 之前等待容器 X,请参阅:svenhornberg 的回答)。不幸的是,我的 golang 容器将退出但永远不会重新启动,我不知道为什么。
Docker-撰写:
version: '3.3'
services:
mongo:
image: 'mongo:3.4.1'
container_name: 'datastore'
ports:
- '27017:27017'
rabbitmq:
restart: always
tty: true
image: rabbitmq:3.7-management-alpine
hostname: "rabbit"
ports:
- "15672:15672"
- "5672:5672"
labels:
NAME: "rabbitmq"
volumes:
- ./rabbitmq-isolated.conf:/etc/rabbitmq/rabbitmq.config
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:15672"]
interval: 3s
timeout: 5s
retries: 20
api:
restart: always
tty: true
container_name: 'api'
build: '.'
working_dir: /go/src/github.com/patientplatypus/project
ports:
- '8000:8000'
volumes:
- './:/go/src/github.com/patientplatypus/project'
- './uploads:/uploads'
- …Run Code Online (Sandbox Code Playgroud) 在声明中声明有什么区别 docker-compose.yml文件中卷部分与仅在服务下使用卷关键字有?
例如,我以这种方式为容器映射一个卷:
services:
mysqldb:
volumes:
- ./data:/var/lib/mysql
Run Code Online (Sandbox Code Playgroud)
这将从我的工作目录映射到名为 data 的文件夹。
但我也可以通过声明一个卷部分来映射一个卷,并为容器使用它的别名:
services:
mysqldb:
volumes:
- data_volume:/var/lib/mysql
volumes:
data_volume:
driver: local
Run Code Online (Sandbox Code Playgroud)
在这种方法中,存储映射文件的实际位置似乎在某种程度上由 docker compose 管理。
这两种方法有什么区别或者它们是一样的吗?我应该真正使用哪一种?
使用一种方法比另一种方法有什么好处吗?
我有以下 docker-compose 文件:
version: '3'
services:
web:
build:
context: ./django_httpd_mod_wsgi
ports:
- "8000:80"
db:
build:
context: ./postgresql
volumes:
- db-data:/var/lib/postgres/data
volumes:
db-data:
Run Code Online (Sandbox Code Playgroud)
我正在使用 archlinux 构建 psotgresql 映像:
以下是我的 postgresql Dockerfile:
FROM archlinux/base
RUN yes | pacman -S postgresql
RUN mkdir /run/postgresql/
RUN chown -R postgres:postgres /run/postgresql/
USER postgres
RUN initdb -D /var/lib/postgres/data
RUN psql -c 'CREATE DATABASE btgapp;'
RUN psql -c "CREATE USER simha WITH PASSWORD 'krishna';"
RUN psql -c 'GRANT ALL PRIVILEGES ON DATABASE btgapp TO simha;'
CMD ["/usr/bin/postgres","-D","/var/lib/postgres/data"] …Run Code Online (Sandbox Code Playgroud) 任何人都可以帮忙吗?
每次我尝试启动 redis 所以我连接我正在编写的应用程序时都会出现错误
错误:对于 redis 无法为服务 redis 创建容器:源不是目录
我像这样创建了一个简单的 dockerfile
FROM redis:5-alpine
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
Run Code Online (Sandbox Code Playgroud)
和我的撰写文件
version: "3"
services:
redis:
container_name: "redis"
build:
context: ./
dockerfile: Dockerfile
ports:
- "6379:6379"
volumes:
- redis-data:/usr/local/etc/redis/redis.conf
networks:
- internal
restart: unless-stopped
volumes:
redis-data:
networks:
internal:
external: false
Run Code Online (Sandbox Code Playgroud)
我尝试删除 dockerfile 中的 COPY 命令并构建了容器。还尝试删除撰写文件中的卷,它还构建了容器。
所以它与此有关,但我看不到它。
有人可以帮忙吗?
我知道我做了一些愚蠢的事情。
文件都在同一个目录下
docker ×10
docker-compose ×10
postgresql ×2
archlinux ×1
django ×1
dockerfile ×1
go ×1
jenkins ×1
mongodb ×1
nginx ×1
node.js ×1
nuxt.js ×1
python ×1
rabbitmq ×1
restart ×1