質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

1841閲覧

Docker for Mac 内での UNIX ソケット パーミッションエラーを無くしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2020/04/10 13:01

編集2020/04/11 19:00

前提・実現したいこと

Docker for Mac 内での UNIX ソケット パーミッションエラーを無くしたい。
ブラウザでは、502 Bad Gateway

ここに質問の内容を詳しく書いてください。

以下の設定でパーミッションエラーになります。
3 日程はまってますが、原因特定出来ず。

宜しくお願い致します。

発生している問題・エラーメッセージ

[crit] 6#6: *9 connect() to unix:/run/go.sock failed (13: Permission denied) while connecting to upstream,

該当のソースコード

( nginx.conf ) events { worker_connections 1024; } http { upstream nginx-internal-sock { server unix:/run/go.sock; } server { listen 80; server_name api.local; real_ip_header X-Forwarded-For; location / { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Accept-Encoding ""; proxy_pass http://nginx-internal-sock/; } } }
( docker-compose.yml ) version: "3.5" services: golang: env_file: .env build: ./app tty: true restart: always container_name: golang volumes: - sample_api_socket:/run:z - ./app:/go/src/github.com/test-api/app - ./log:/var/log/test-api networks: - sample_api_network nginx: env_file: .env build: ./nginx container_name: nginx restart: always environment: VIRTUAL_HOST: test-api.local VIRTUAL_PORT: 80 volumes: - sample_api_socket:/run:z ports: - "80" networks: - sample_api_network - sample_shop_network - services_network depends_on: - "golang" minio: env_file: .env image: minio/minio:RELEASE.2019-07-05T21-20-21Z container_name: minio restart: always environment: VIRTUAL_HOST: test-minio.local VIRTUAL_PORT: ${MINIO_PORT} MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY} MINIO_SECRET_KEY: ${MINIO_SECRET_KEY} volumes: - ./minio/export:/export - ./minio/data:/data/minio ports: - "${MINIO_PORT}" networks: - sample_api_network - services_network command: server /data/minio volumes: sample_api_socket: external: true networks: sample_api_network: name: sample_api driver: bridge sample_shop_network: name: sample_shop driver: bridge services_network: name: services driver: bridge

試したこと

nginx.conf の go.sock は生成されるファイルだと考えているので、
go.sock に対するディレクトリのパーミッションやユーザの変更。
ディレクトリの指定変更

Ubuntu 18 以降で同様のテストとエラーの再現確認等

補足情報 (FW/ツールのバージョンなど)

macOS Mojave 10.14.6
Google Chrome
80.0.3987.163

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おそらく、docker-compose.yml の

yml

1volumes: 2- api_socket:/run:z

の部分が問題で SELinux とのからみなのだと思います。ymlの構文上ダブルクオーテーションで囲む必要があるように思われます。

yml

1volumes: 2- "api_socket:/run:z"

ただし、そういう問題だと  docker-compose 時にエラーになりそうです。/run は起動ごとに初期化されても問題ないディレクトリのはずなので、以下に変えてみてはどうでししょう。

yml

1tmpfs: /run

2020/4/13 go.sock に直接パーミッション 777 と変更すれば、動作するということですので、全面的に回答を見直します。

nginx のワーカプロセスはコンテナ内でもユーザID nginx で動作します。したがって、/run/go.socket がgolang 側の root ユーザで作成されていると Permission denied のエラーになります。
Dockerfile で /etc/nginx/nginx.conf の user ディレクティブの値を以下のように変更(COPY で修正済みのものを配置か sed -i で編集)すれば回避できるのではないでしょうか?

修正前 /etc/nginx/nginx.conf:

user nginx;

修正後 /etc/nginx/nginx.conf:

user root;

投稿2020/04/11 01:14

編集2020/04/13 01:42
mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/04/12 09:17

ご回答 ありがとうございます。 nginx: (省略) # - api_socket:/run:z tmpfs: /run ということでしょうか ? こんな感じでしてみました。 以下がログの内容です。上手くはいきませんでした。 [crit] 6#6: *3 connect() to unix:/run/go.sock failed (2: No such file or directory) while connecting to upstream, client: 172.18.0.3, server: api.local, request: "GET /favicon.ico HTTP/1.1", upstream: "http://unix:/run/go.sock:/favicon.ico", host: "api.local", referrer: "http://api.local/" 172.18.0.3 - - [12/Apr/2020:09:14:17 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://api.local/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
mit0223

2020/04/12 23:31

あ、docker-compose.yml をタグ付けしていただいて、sample_api_socket は共有ボリュームであることがわかりました。tmpfs では解決しないですね。一度 volumes の下の各要素をダブルクオーテーションで囲ってやってみてもらえますか。
退会済みユーザー

退会済みユーザー

2020/04/12 23:31

Docker コンテナに入り go.sock に直接パーミッション 777 と変更しています。 ただ、ビルドや再起動時で、戻ってしまうのが PG 組みにくいですね。。。
mit0223

2020/04/12 23:37

あと、 ./app/Dockerfile と ./nginx/Dockerfile も質問に貼ってもらえますか。
mit0223

2020/04/12 23:38

あれ?パーミッション777 で動くのですか?それであれば、SELinux は関係なくて、プロセスの実行ユーザIDとかの問題なので、もっと話が簡単だと思います。
mit0223

2020/04/12 23:48

ちょっと、全面的に書き直しますね。
退会済みユーザー

退会済みユーザー

2020/04/13 12:19

ありがとうございます。 ( ./nginx/DockerfileDockerfile ) FROM nginx:1.17.0 COPY ./nginx.conf /etc/nginx/nginx.conf ( ./app/Dockerfile ) FROM golang:1.12 RUN go get -u github.com/gorilla/mux && \ go get -u github.com/gin-gonic/gin && \ go get -u github.com/lib/pq && \ go get -u github.com/jinzhu/gorm && \ go get -u github.com/joho/godotenv && \ go get -u github.com/go-redis/redis && \ go get -u github.com/sirupsen/logrus && \ go get -u github.com/t-tomalak/logrus-easy-formatter && \ go get -u github.com/dgrijalva/jwt-go && \ go get -u github.com/oxequa/realize && \ go get github.com/rs/xid && \ go get gopkg.in/gomail.v2 && \ go get github.com/dustin/go-humanize WORKDIR /go/src/github.com/api/ CMD bash -c "cd app && \ if [[ \"$IS_GO_TEST\" == \"true\" ]]; then \ go test ./...; \ fi &&\ if [[ \"$IS_REALIZE\" == \"true\" ]]; then \ realize start --server; \ else \ go run *.go; \ fi" 今は、ビルドすると、またパーミッションエラーになるので、 どのタイミングが良いかはわかりませんが、 Dockerfile にパーミッションを変更するコマンド追加を試しています。
退会済みユーザー

退会済みユーザー

2020/04/13 12:57

すみません、間違えていました。 パーミッションエラーではなく 111 エラーでした。 go.sock は 777 のまま、build や up -d では画面表示されてましたが、 Docker for Mac 再起動後になりました。 [error] 6#6: *19 connect() to unix:/run/go.sock failed (111: Connection refused) while connecting to upstream, client: 172.18.0.2, server: orderup-shop.local, request: "GET /favicon.ico HTTP/1.1", upstream: "http://unix:/run/go.sock:/favicon.ico",
退会済みユーザー

退会済みユーザー

2020/04/14 00:38

現状では、Docker for Mac 起動、再起動後に go.sock が新たに生成、権限が戻ります。 1. 対象コンテナを一度削除。 2. 対象コンテナを再度ビルド、アップ。 3. 対象コンテナ内に入り go.sock の権限を 777 にする。 4. Chrome をリロードで復帰。 ま、全体的に手間で、こんな方法しかないものかと、 Dockerfile にこの上記 3 の手間をコマンドで記載していますが、 書き方が悪いのか、コンテナが作成されません。 原因不明の現象です。 これが現状です。
退会済みユーザー

退会済みユーザー

2020/04/14 01:32

user root; 書き入れましたが、コンテナ新規作成時に問題なく起動を確認しました。 その後は再起動後、上記のようになり、コンテナを消去、そして作成をする感じです。 Docker は常に以下のような状態です。 srwxr-xr-x 1 root root 0 Apr 14 01:25 go.sock drwxrwxrwx 2 root root 4096 Jan 30 00:00 lock -rw-r--r-- 1 root root 2 Apr 14 01:25 nginx.pid -rwxrwxrwx 1 root utmp 0 Jan 30 00:00 utmp
mit0223

2020/04/14 04:50

go.sock は golang コンテナが起動時に作成し、終了時に削除するものだと思います。111: connection refused は一度 go.sock が作成されたあと、golang コンテナが終了してもバインドされていないソケットが残ってしまうせいで出るのではないかと思います。基本的に golanga が終了するときに go.sock を消すはずなのですが、そこがうまく動いていないのではないでしょうか。。
退会済みユーザー

退会済みユーザー

2020/04/14 13:40

その通りですね。 ただ、初期ビルド時の go.sock のパーミッションエラーが不明です。 Ubuntu でも試しましたが同様のエラーでした。 仕様なのかなんなのか今後も調査します。 お付き合い頂きありがとうございました。 開発を続けることが出来ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問